获取另一个节点的子节点,给定节点名称
Posted
技术标签:
【中文标题】获取另一个节点的子节点,给定节点名称【英文标题】:Get child Node of another Node, given node name 【发布时间】:2011-07-30 21:49:04 【问题描述】:我有一个这样的 XML:
<documentslist>
<document>
<docnumber>1</docnumber>
<docname>Declaration of Human Rights</docname>
<aoo>lib</aoo>
</document>
<document>
<docnumber>2</docnumber>
<docname>Fair trade</docname>
<aoo>lib</aoo>
</document>
<document>
<docnumber>3</docnumber>
<docname>The wars for water</docname>
<aoo>lib</aoo>
</document>
<!-- etc. -->
</documentslist>
我有这个代码:
//XML parsing
Document docsDoc = null;
try
DocumentBuilder db = dbf.newDocumentBuilder();
docsDoc = db.parse(new InputSource(new StringReader(xmlWithDocs)));
catch(ParserConfigurationException e) e.printStackTrace();
catch(SAXException e) e.printStackTrace();
catch(IOException e) e.printStackTrace();
//retrieve document elements
NodeList docs = docsDoc.getElementsByTagName("document");
if (docs.getLength() > 0)
//print a row for each document
for (int i=0; i<docs.getLength(); i++)
//get current document
Node doc = docs.item(i);
//print a cell for some document children
for (int j=0; j<columns.length; j++)
Node cell;
//print docname
cell = doc.getElementsByTagName("docname").item(0); //doesn't work
System.out.print(cell.getTextContent() + "\t");
//print aoo
cell = doc.getElementsByTagName("aoo").item(0); //doesn't work
System.out.print(cell.getTextContent() + "\t");
System.out.println();
但是,如您所知,Node
没有getElementsByTagName
方法...只有Document
有它。但我不能做docsDoc.getElementsByTagName("aoo")
,因为它会返回我所有的<aoo>
节点,而不仅仅是我正在检查的<document>
节点中存在的那个。
我该怎么做?谢谢!
【问题讨论】:
谷歌或***:递归。 【参考方案1】:如果Node
不只是任何节点,实际上是Element
(也可以是属性或文本节点),您可以将其转换为Element
并使用getElementsByTagName
。
【讨论】:
这并不完全正确。 Element 实际上扩展了 Node 而不是相反。我不会依赖 Node 始终是一个元素,请确保在检查 Node 的类型后像 Yeameen 建议的那样使用 instanceof 进行转换。参考:docs.oracle.com/javase/6/docs/api/org/w3c/dom/Element.html【参考方案2】:你应该递归阅读它,前段时间我有同样的问题并用这段代码解决:
public void proccessMenuNodeList(NodeList nl, JMenuBar menubar)
for (int i = 0; i < nl.getLength(); i++)
proccessMenuNode(nl.item(i), menubar);
public void proccessMenuNode(Node n, Container parent)
if(!n.getNodeName().equals("menu"))
return;
Element element = (Element) n;
String type = element.getAttribute("type");
String name = element.getAttribute("name");
if (type.equals("menu"))
NodeList nl = element.getChildNodes();
JMenu menu = new JMenu(name);
for (int i = 0; i < nl.getLength(); i++)
proccessMenuNode(nl.item(i), menu);
parent.add(menu);
else if (type.equals("item"))
JMenuItem item = new JMenuItem(name);
parent.add(item);
也许你可以根据你的情况调整它。
【讨论】:
【参考方案3】:检查Node
是否是Dom Element
,转换并调用getElementsByTagName()
Node doc = docs.item(i);
if(doc instanceof Element)
Element docElement = (Element)doc;
...
cell = doc.getElementsByTagName("aoo").item(0);
【讨论】:
if (node.getNodeType() == Node.ELEMENT_NODE)【参考方案4】://xn=list of parent nodes......
foreach (XmlNode xn in xnList)
foreach (XmlNode child in xn.ChildNodes)
if (child.Name.Equals("name"))
name = child.InnerText;
if (child.Name.Equals("age"))
age = child.InnerText;
【讨论】:
请评论您的代码的亮点,这将有助于解决问题。这将有助于使其更易于理解。 这看起来不像 Java。以上是关于获取另一个节点的子节点,给定节点名称的主要内容,如果未能解决你的问题,请参考以下文章
如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序