获取另一个节点的子节点,给定节点名称

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"),因为它会返回我所有的&lt;aoo&gt; 节点,而不仅仅是我正在检查的&lt;document&gt; 节点中存在的那个。

我该怎么做?谢谢!

【问题讨论】:

谷歌或***:递归。 【参考方案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。

以上是关于获取另一个节点的子节点,给定节点名称的主要内容,如果未能解决你的问题,请参考以下文章

仅在openxml中获取指定节点的子节点

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序

读取具有多个名称空间的子节点

xpath选择父节点类型不同的子节点

关于c#中treeview节点的收缩与展开(.net web)

ztree 获取当前选中节点的子节点集合