在JAVA中处理包含XML的字符串的最有效方法

3
我有一个包含XML节点的字符串,并希望使用DOM解析来处理该字符串,以提取节点值并将其存储在本地变量中。
存储在字符串变量中的XML:
<carGarage>
   <car>
      <make>Chrysler</make>
      <color>Red</color>
   </car>
   <car>
      <make>Musano</make>
      <color>Blue</color>
   </car>
</carGarage>

我想要在我的Java类中提取XML值并将它们存储在本地属性中。
public class CarGarage
{   String make, color;

    public void setMake(String make)
    { this.make = make; }

    public void setColor(String color)
    { this.color = color; }

    public void DOMparsingMethod(Node thisNode)
    { int typeOfNode = thisNode.getNodeType();
      ...
    }
}

最好的方法是什么?我已经看了StringBufferInputStream,但那个已经被弃用了。我真的很迷茫。 谢谢, 卢卡斯。
5个回答

2

可以考虑使用DocumentBuilder 来解析各种输入流。这里有一个示例,从文件中读取到类似于你的类的内容。


嗨Justin, 我一直在使用DocumentBuilderFactory和Document Builder,但是当我打印值时,它会得到[#DOCUMENT: NULL]...这可能是因为我没有返回文档元素节点,而是其下的第一个子节点,在这种情况下,是<carGarage>标签吗? - Lycana
你的代码开头有 <?xml version="1.0"?> 吗?也许是因为没有这个导致它找不到任何数据。 - justinhj

1

有很多对象到XML绑定库可以做到你想要的,但它们往往是笨重的工具。

对于这个简单的例子,自己处理DOM是有意义的。justinhj建议使用内置的Java库,这是一个好的开始,尽管有时会变得丑陋,因为JDK通常不会为您提供XML解析器,需要您在幕后神奇地插入自己。

我倾向于使用jdom来处理这种情况。它与DocumentBuilder路线实际上是相同的,但类似并且只部分兼容。


1

个人而言,我会选择SAX(http://xerces.apache.org/xerces-j/),因为我习惯使用它,并且我认为SAX并不需要太多编码,因为它是相对简单的代码,而且与stax不同,它是模式无关的代码(无论价值如何)。 - corlettk
我使用SAX已经很多年了,但我发现Stax更简单,所以我倾向于偏爱它,因为对于SAX,我编写了自己的代码来处理所有事情。 - James Black

1

我建议您看一下XStream。它支持将XML转换为对象。您可以将XML提供给它,它会给您返回您想要的对象列表。


0
在我的经验中,DOM 对于这种事情非常有用,因为它与 SAX / STAX 相比具有较低的学习曲线,即使它不如后者快速或内存高效。一旦你获得了 DOM 文档,你可以使用 XPath 查询来获取单个元素内容并解析它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接