从xml中提取节点的值

Posted

技术标签:

【中文标题】从xml中提取节点的值【英文标题】:Extracting the value of nodes from xml 【发布时间】:2011-08-17 14:11:22 【问题描述】:

我有两个不同的 XML 文件,第一个是模板 xml,第二个是实际的 xml。模板 xml 仅包含实际 xml 包含模板 xml 中存在的一些元素的元素,如下面的 xml 文件所示。对于模板 xml 中存在的每个元素,我想查看实际的 xml 并查看该元素是否存在,如果存在则提取其值并打印,否则只打印空白空间,如输出所示

模板.xml

<personinfo>
   <person>
     <name><name>
     <age></age>
     <address>
     <street></street>
     <city></city>
     <address>
   </person>
   <person>
     <name><name>
     <age></age>
     <address>
     <street></street>
     <city></city>
     <address>
   </person>
   <person>
     <name><name>
     <age></age>
     <address>
     <street></street>
     <city></city>
     <address>
   </person>
</personinfo>

实际.xml

<personinfo>
   <person>
     <name>tom<name>
     <age>26</age>
     <address>
     <street>main street</street>
     <city>washington</city>
     <address>
   </person>
   <person>
     <name>mike<name>
     <age>30</age>
     <address>
     <street>first street</street>
     <city>dallas</city>
     <address>
   </person>
</personinfo>

预期输出

tom,26,main street,washington,mike,30,first street,dallas,,,,

【问题讨论】:

您有什么具体问题吗?向我们展示您迄今为止所做的工作以及遇到的问题。 我尝试使用 dom 解析这些 xml 文件,并为每个 xml 提供两个单独的文档,之后我不知道如何在实际 xml 中从模板 xml 中一一查看元素并获取值... @Naveen 你用什么来解析 xml? Jdom - jdom.org 简单易用。至于逐个获取元素,jdom会让你通过调用element.getChildren来获取元素列表。然后对于每个元素,您可以递归调用相同的方法。 【参考方案1】:

首先,您应该为 XML 而不是模板定义一个模式。接下来,您可以创建一个 Person 的 java bean。这可以使用 JAXB 映射到每个人。这对我来说是过去 XML 解析最快的方法。 http://jaxb.java.net/

【讨论】:

【参考方案2】:

这个例子很小,所以这可能还不是问题,但我会选择 SAX 而不是 DOM 来解析 XML 的内容。如果找到事件输出内容非常容易。

例如阅读 JAVA 中的 XML 处理:

here 和here 以及许多其他网站、文章和书籍

【讨论】:

【参考方案3】:

一个。将两个文档解析为 DOM

b.递归遍历模板

c。 (选项 1)为找到的每个元素构建一个 xpath(使用堆栈和推送/弹出?)

d。 (选项 1)在 actual.xml 上运行 xpath

c。 (选项2)与模板同时递归遍历actual。如果未找到该元素,则停止更深入地遍历模板。

【讨论】:

以上是关于从xml中提取节点的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBscript 从节点和子节点的 XML 中提取数据

从多个 XML 节点中提取值 [重复]

从返回的节点的 Goutte 请求中提取特定的 xml

在 JAVA 中使用 SAX 解析器从 XML 文件中提取文本节点

从 XML 字符串中提取内部节点到 JSON 字符串

使用 JAXB 获取 XML 子节点的值