簡體   English   中英

如何從xml獲取選定的值?

[英]How to get selected value from xml?

也許有人可以幫我解決這個問題。 我嘗試使用以下代碼生成XML文件:

    protected void parseAndReadXML (String xmlFile){
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(false);
            DocumentBuilder db = dbf.newDocumentBuilder();
            try {
                Document doc = db.parse(xmlFile);
                doc.getDocumentElement().normalize();
                System.out.println(doc.getDocumentElement().getNodeName());

                NodeList nList = doc.getElementsByTagName("films");

                System.out.println("Information of comedy films");

                for(int i=0; i<nList.getLength();i++){

                    Node firstNode = nList.item(i);

                    if(firstNode.getNodeType() == Node.ELEMENT_NODE){

                        Element firstElem = (Element) firstNode;

                        NodeList fstNmElmntLst = firstElem.getElementsByTagName("name");

                          Element fstNmElmnt = (Element) fstNmElmntLst.item(0);

                          NodeList fstNm = fstNmElmnt.getChildNodes();

                          System.out.println("Name : "  + ((Node) fstNm.item(0)).getNodeValue());

                          NodeList secNmElmntLst = firstElem.getElementsByTagName("actor");

                          Element secNmElmnt = (Element) secNmElmntLst.item(0);

                          NodeList secNm = secNmElmnt.getChildNodes();

                          System.out.println("Actor Name : " + ((Node) secNm.item(0)).getNodeValue());

                          NodeList therNmElmntLst = firstElem.getElementsByTagName("year");

                          Element lstNmElmnt = (Element) therNmElmntLst.item(0);

                          NodeList therNm = lstNmElmnt.getChildNodes();

                          System.out.println("Year : " + ((Node) therNm.item(0)).getNodeValue());
                    }
                }

            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {       
                e.printStackTrace();
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }   
    }

這是我使用的XML

<CinemaCity>
  <genre>
    <comedy>
        <films>
            <name>A</name>
            <actor>CBrus</actor>
            <year>111</year>
        </films>
        <films>
            <name>B</name>
            <actor>CBrus2</actor>
            <year>111</year>
        </films>
        <films>
            <name>C</name>
            <actor>CBrus3</actor>
            <year>111</year>
        </films>
        <films>
            <name>D</name>
            <actor>CBrus4</actor>
            <year>111</year>
        </films>
    </comedy>
    <horror>
        <films>
            <name>A</name>
            <actor>HBrus</actor>
            <year>111</year>
        </films>
        <films>
            <name>B</name>
            <actor>HBrus2</actor>
            <year>111</year>
        </films>
        <films>
            <name>C</name>
            <actor>HBrus3</actor>
            <year>111</year>
        </films>
        <films>
            <name>D</name>
            <actor>HBrus4</actor>
            <year>111</year>
        </films>
     </horror>
   </genre>
</CinemaCity>

我只需要打印喜劇電影。 運行這段代碼后,我得到所有類型的所有電影。
我做錯了什么?

您應該使用xpath搜索XML文檔。 它不僅是最簡潔的api,而且在遍歷XML文檔時也是最高效的。

這是您需要的代碼:

import javax.xml.xpath.*;
import javax.xml.parsers.*;

Document doc = db.parse(xmlFile);

XPath xPath =  XPathFactory.newInstance().newXPath();
NodeList nList = (NodeList)xPath.compile("/CinemaCity/genre/comedy/films")
        .evaluate(doc, XPathConstants.NODESET);

System.out.println("Information of comedy films");
...

用這條線

NodeList nList = doc.getElementsByTagName("films");

您選擇所有電影。 如果將影片修改為喜劇,則節點列表將包含喜劇下的所有影片。

更改:

NodeList nList = doc.getElementsByTagName("films");

至:

NodeList nList = doc.getElementsByTagName( "comedy" ).item( 0 ).getChildNodes();

在這種情況下,您將選擇第一個喜劇電影節點,然后為其選擇所有子節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM