我是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。我想这应该按照从上到下和从左到右的顺序为每个节点完成。 :(
答案 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。