如何使用XML DOM API转到每个非文本节点?

时间:2009-04-06 08:04:20

标签: xml dom

我是XML和DOM的新手。我想我需要使用DOM API来查找遍历每个非文本节点一次,并输出节点名称。

说我从W3C获得了这个示例XML

<bookstore>

<book category="cooking">
 <title lang="en">Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
 <page pagenumber="550"/>
</book>

<book category="children">
 <title lang="en">Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
 <page pagenumber="500"/>
</book>
</bookstore>

我需要找到<page pagenumber="500" />这样的节点,这是一个非文本节点

我该怎么做? seduo-code也没关系。谢谢

我可以说

 while (x.nodeValue == NULL) {
   read the next node ?
}

我想我应该清楚自己,不要假设任何博士。只要存在非文本节点,这应该适用于所有XML。我想这应该按照从上到下和从左到右的顺序为每个节点完成。 :(

4 个答案:

答案 0 :(得分:3)

XPATH =“// * [not(text())]”
将选择所有非文本节点的节点。
在给定的示例中:书店书籍也是非文本节点,因为它们没有自己的任何文本,尽管他们的孩子确实有文本。

答案 1 :(得分:2)

您的问题基本上似乎是:在给定XML文档的情况下,如何查找没有任何文本内容的子节点。

一个简单的XPath表达式,例如:

/bookstore/book/*[count(child::text()) = 0]

/bookstore/book/*[not(text())]

会为你做的。在示例文档上应用此XPath表达式将返回包含page元素的节点集。您可以预先知道页面元素的名称,甚至不必知道book元素的所有可能子元素的名称。

解释:您需要查询不包含任何文本子节点的book元素的子节点。 child :: *轴表示当前节点的所有子节点,text()node-type将处理后的节点类型限制为包含文本内容的节点类型。

修改:请注意,如果您要查询任何 XML文档中的非文本节点(根据您对该问题的最新编辑),您应该选择答案由 nils_gate 提供。我的回答是在您编辑之前给出的,并说明了概念,而不是提供通用解决方案。

答案 2 :(得分:1)

您对需要查找的节点了解多少?如果您确切知道它是:

  • page元素
  • 它的pagenumber属性值为500

然后XPath是前进的方向(假设它在您的平台上可用 - 您没有指定超出“DOM”;大多数DOM实现包括XPath,据我所见)。

在这种情况下,您将使用XPath:

//page[@pagenumber='500']

如果您无法使用XPath,请说明您正在使用的DOM API,我们可以尝试提供最佳解决方案。基本上,您可能最终会迭代每个元素节点,检查其名称是否为page,然后检查它是否具有适当的pagenumber属性值。

答案 3 :(得分:1)

看起来你需要一个XPath。 W3 Schools网站有a good reference,但是,假设节点始终显示在节点下,XPath /bookstore/book/page将返回一个节点集,其中包含每个节点。 /bookstore/book/page[@pagenumber='500']将获取pagenumber属性值为500的每个节点。

//语法将在文档中的任何位置找到节点而不用担心结构 - 这可能更容易但速度较慢,尤其是对于大型文档。如果您的文档具有已知结构,则最好使用显式XPath。