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

Posted

技术标签:

【中文标题】在 JAVA 中处理包含 XML 的字符串的最有效方法【英文标题】:Most effective way to process a string containing XML, in JAVA 【发布时间】:2010-10-26 19:26:10 【问题描述】:

我有一个字符串,其中包含 XML 节点,并且正在寻求使用 DOM 解析来处理此字符串以提取节点值并将它们存储在局部变量中。

存储在 String 变量中的 XML:

<carGarage>
   <car>
      <make>Chrysler</make>
      <color>Red</color>
   </car>
   <car>
      <make>Musano</make>
      <color>Blue</color>
   </car>
</carGarage>

我想要提取 XML 值并将它们存储在本地属性中的 Java 类:

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 但已弃用。 我真的很迷茫。

谢谢你, 卢卡斯。

【问题讨论】:

【参考方案1】:

看看使用DocumentBuilder 解析任何类型的输入流。这是一个example,它从文件中读取像你这样的类。

【讨论】:

嗨贾斯汀,我一直在使用 DocumentBuilderFactory 和 Document Builder,但是当我将值打印出来时,它得到 [#DOCUMENT: NULL]...这可能是因为我没有返回文档元素节点,但它下面的第一个子节点,在本例中是 标记? 顶部有 吗?也许只是因为这个原因没有找到任何数据。【参考方案2】:

有很多 object-to-xml 绑定库可以完全满足您的需求,但它们往往是相当庞大的工具。

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

对于这类事情,我更喜欢jdom。它实际上与 DocumentBuilder 路由相同,但相似且仅部分兼容。

【讨论】:

【参考方案3】:

为什么要使用 DOM?

如果您只是想读入并将 xml 转换为对象,那么我建议您使用 STAX,因为 SAX 比 DOM 快,但是编码太多,STAX 更好,您可以在下面了解更多信息。 https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/programming-and-development/?p=639

【讨论】:

我个人会选择 SAX (xerces.apache.org/xerces-j),因为我已经习惯了,而且我不认为 SAX 编码太多,因为它的代码比较简单,而且不像 stax ,它是与模式无关的代码(无论其价值如何)。 我使用 SAX 多年,但我发现 Stax 更简单,所以我更喜欢它,因为对于 sax,我编写了自己的代码来处理所有事情。【参考方案4】:

根据我的经验,DOM 对这类事情很有用,因为与 SAX / STAX 相比,它的学习曲线较低,尽管它的速度或内存效率不高。获得 DOM 文档后,您可以对文档使用 XPath 查询来获取单个元素内容并对其进行解析。

【讨论】:

【参考方案5】:

我建议你看看XStream。它支持将 XML 转换为对象。你可以给它 XML,它会给你一个你想要的对象列表。

【讨论】:

以上是关于在 JAVA 中处理包含 XML 的字符串的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

检查数组是不是包含Java中的值的最有效方法? [复制]

使用 C#,将包含二进制数据的字符串转换为字节数组的最有效方法是啥

在java中构建未排序二叉树的最有效方法是啥?

(预)处理存储在 json 中的大型数据集的最有效方法是啥?

在Java中检测偶数的最有效方法是什么? [重复]

在巨大列表中查找/搜索的最有效方法(python)