从 Java DOM 中的 XML 获取元素名称

Posted

技术标签:

【中文标题】从 Java DOM 中的 XML 获取元素名称【英文标题】:Get element name from XML in Java DOM 【发布时间】:2013-01-22 11:29:17 【问题描述】:

我想获取元素名称并打印 XML 中的数据,但不确定如何获取特定元素下的数据。

这是 XML 示例和我的代码。

   <mdb>
    <movies>
    <movie id="godfather">
      <title>The Godfather</title>
      <year>1972</year>
      <directors>
        <director idref="francisfordcoppola"/>
      </directors>
      <genres>
        <genre>Crime</genre>
        <genre>Drama</genre>
      </genres>
       <cast>
        <performer>
          <actor idref="marlonbrando"/>
          <role>Don Vito Corleone</role>
        </performer>
     </cast>
    </movie>
    </movies>

    <performer id="kimnovak">
      <name>Marilyn Pauline Novak</name>
      <dob>1933-02-13</dob>
      <pob>Chicago, Illinois, USA</pob>
      <actedin>
        <movie idref="vertigo"/>
      </actedin>
    </performer>
    </mdb>



try 
        File fXmlFile = new File(filename);
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);

        NodeList nodes = doc.getElementsByTagName("movie");
         System.out.println("nodes length"+ nodes.getLength());
        for (int i = 0; i < nodes.getLength(); i++)
            Element element = (Element) nodes.item(i);
            NodeList name = element.getElementsByTagName("title");
            Element line = (Element) name.item(0);
            System.out.println(": " + line.getFirstChild().getTextContent());

我只想获取电影中的元素。但下面的代码也读取 &lt;movie idref="vertigo"/&gt; 在执行者内部(如果我想获取内容会导致 Nullpointer 异常);我想知道是否有任何可能的方法可以避免通过使用 DOM 来读取性能?

NodeList nodes = doc.getElementsByTagName("movie");

第一部电影的最终输出应该是这样的

('godfather', 'The Godfather', '1972', 'Crime;Drama')

【问题讨论】:

【参考方案1】:

一种方法是从电影标签而不是电影标签开始读取。不知道这是否是你要找的!

NodeList nodes = doc.getElementsByTagName("movies");

Element element = (Element) nodes.item(0);
NodeList movieList = element.getElementsByTagName("movie");
for (int i = 0; i < movieList.getLength(); i++) 
    Element movieElement = (Element) movieList.item(i);
    System.out.println(movieElement.getAttributes().getNamedItem("id").getNodeValue());
    NodeList name = movieElement.getElementsByTagName("title");
    NodeList year = movieElement.getElementsByTagName("year");
    NodeList genres = movieElement.getElementsByTagName("genres");
    Element genreline = (Element) genres.item(0);

    System.out.println(name.item(0).getFirstChild().getTextContent());
    System.out.println(year.item(0).getFirstChild().getTextContent());
    System.out.println(genreline.getElementsByTagName("genre").item(0).getTextContent() 
               + ":" + genreline.getElementsByTagName("genre").item(1).getTextContent());

输出:

:教父 : 教父 : 1972 : 罪案剧

【讨论】:

谢谢,我需要使用 SAX 或 DOM。你认为它在萨克斯或 dom 中可行吗?【参考方案2】:

我建议你阅读XPath。这里有几个examples。

例如,要读取电影的年份,您可以使用 XPath...

/mdb/movies/movie/year/text()

【讨论】:

谢谢。你知道是否可以通过使用 DOM 来避免读取性能下的 吗? 那将是一个单独的问题。我很少看到在 XML 解析此类数据时需要这种粒度。如果查找速度是一个问题,那么 XML 可能不是您想要的存储。 那么如果我想输出所有电影中的所有数据。我必须为每个元素创建一个路径还是有其他捷径? 继续搜索,但是是的... /mdb/movies/movie/*【参考方案3】:

我有同样的问题,这是我的实现,

public String getTagValue(org.w3c.dom.Document xmlDoc, String tagName) throws Exception 
        xmlDoc.getDocumentElement().normalize();

        NodeList nodeList = xmlDoc.getElementsByTagName(tagName);

        for (int temp = 0; temp < nodeList.getLength(); temp++) 
            Node nNode = nodeList.item(temp);
            if (nNode.getNodeType() == Node.ELEMENT_NODE) 
                org.w3c.dom.Element eElement = (org.w3c.dom.Element) nNode;
                return eElement.getFirstChild().getNodeValue();
            
        
        return "-1";
    

【讨论】:

以上是关于从 Java DOM 中的 XML 获取元素名称的主要内容,如果未能解决你的问题,请参考以下文章

XML DOM

Java:使用DOM4j来实现读写XML文件中的属性和元素

Java:使用DOM4j来实现读写XML文件中的属性和元素

XML的DOM对象,到HTML

C#如何从xml文件中获取所有元素名称

JS基础 DOM