簡體   English   中英

在android中使用DOM解析XML

[英]Parse XML using DOM in android

嗨,我想解析XML並根據用戶選擇顯示列表

我的xml看起來像這樣

在此處輸入圖片說明

下面是我的代碼

      try {
            XMLParser parser = new XMLParser();
            Document doc = parser.getDomElement(xml); // getting DOM element
            NodeList n1 = doc.getElementsByTagName("company");

            // looping through all item nodes <item>
            for (int i = 0; i < n1.getLength(); i++) {
                // creating new HashMap
                Element e = (Element) n1.item(i);

                System.out.println("name node "+parser.getValue(e, "name"));
            }

通過這種方式,我得到的輸出像

  Company ABC
  Company XYZ

公司列表


我會寫像

        NodeList n1 = doc.getElementsByTagName("province"); 
        // looping through all item nodes <item>
            for (int i = 0; i < n1.getLength(); i++) {
                // creating new HashMap
                Element e = (Element) n1.item(i);

                System.out.println("name node "+parser.getValue(e, "name"));
            }

我正在獲取省名列表

   Alberta
   Ontario
   New York
   Florida

但它應該像這樣工作

當我選擇公司ABC

僅顯示兩個供應清單

       Alberta
       Ontario

並非所有顯示器都可以幫助我重寫代碼

在“公司”節點上使用Node.getChildNodes() 然后,要獲取子省節點,請按名稱進行比較。 例:

    XMLParser parser = new XMLParser();
    Document doc = parser.getDomElement(xml); // getting DOM element
    NodeList n1 = doc.getElementsByTagName("company");

    // looping through all item nodes <item>
    for (int i = 0; i < n1.getLength(); i++) {
        Node companyNode = n1.item(i);
        NodeList childNodes = companyNode.getChildNodes();
        // Here we're getting child nodes inside the company node.
        // Only direct childs will be returned (name and province)  

        for (int j = 0; j < childNodes.getLength(); j++) {
            Node childNode = childNodes.item(j);
            if("province".equalsIgnoreCase(childNode.getName())){
                //Do something with province
            }
        }
    }

應該這樣做:

        XMLParser parser = new XMLParser();
        Document doc = parser.getDomElement(xml); // getting DOM element
        NodeList n1 = doc.getElementsByTagName("company");

        // looping through all item nodes <item>
        for (int i = 0; i < n1.getLength(); i++) {
            Element e = (Element) n1.item(i);
            System.out.println("name node "  +parser.getValue(e, "name"));
            NodeList children = e.getChildNodes();
            for (int j = 0; j < children.getLength(); j++) {
                 Node child = children.item(j);
                 if (child.getNodeName().equalsIgnoreCase("province")) {
                      System.out.println("name node " + parser.getValue((Element)child, "name"));
                 }
            }
        }

嘗試以下代碼:

public class MainActivity  extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /** Create a new layout to display the view */
    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(1);

    /** Create a new textview array to display the results */
    TextView name[];
    TextView website[];
    TextView category[];

    try {

        URL url = new URL(
                "http://xyz.com/aa.xml");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(url.openStream()));
        doc.getDocumentElement().normalize();

        NodeList nodeList = doc.getElementsByTagName("item");

        /** Assign textview array lenght by arraylist size */
        name = new TextView[nodeList.getLength()];
        website = new TextView[nodeList.getLength()];
        category = new TextView[nodeList.getLength()];

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

            Node node = nodeList.item(i);

            name[i] = new TextView(this);
            website[i] = new TextView(this);
            category[i] = new TextView(this);

            Element fstElmnt = (Element) node;
            NodeList nameList = fstElmnt.getElementsByTagName("name");
            Element nameElement = (Element) nameList.item(0);
            nameList = nameElement.getChildNodes();
            name[i].setText("Name = "
                    + ((Node) nameList.item(0)).getNodeValue());

            NodeList websiteList = fstElmnt.getElementsByTagName("website");
            Element websiteElement = (Element) websiteList.item(0);
            websiteList = websiteElement.getChildNodes();
            website[i].setText("Website = "
                    + ((Node) websiteList.item(0)).getNodeValue());

            category[i].setText("Website Category = "
                    + websiteElement.getAttribute("category"));

            layout.addView(name[i]);
            layout.addView(website[i]);
            layout.addView(category[i]);

        }
    } catch (Exception e) {
        System.out.println("XML Pasing Excpetion = " + e);
    }

    /** Set the layout view to display */
    setContentView(layout);

}
}

在文檔對象上調用的getElementsBytagName將始終返回整個文檔中具有給定標簽名稱的所有節點的列表。 相反,過濾掉您感興趣的單個公司元素,然后在上調用getElementsByTagName。 例如

Element companyEl = doc.getElementById(desiredCompanyId);
if (companyEl != null) { // always good to check
    NodeList n1 = companyEl.getElementsByTagName("province");

    // your code here
}

嘗試使用此代碼

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

        Node node = nodeList.item(i);

        name[i] = new TextView(this);
        website[i] = new TextView(this);
        category[i] = new TextView(this);

        Element fstElmnt = (Element) node;
        NodeList nameList = fstElmnt.getElementsByTagName("name");
        Element nameElement = (Element) nameList.item(0);
        nameList = nameElement.getChildNodes();
        name[i].setText("Name = "
                + ((Node) nameList.item(0)).getNodeValue());

        NodeList websiteList = fstElmnt.getElementsByTagName("website");
        Element websiteElement = (Element) websiteList.item(0);
        websiteList = websiteElement.getChildNodes();
        website[i].setText("Website = "
                + ((Node) websiteList.item(0)).getNodeValue());

        category[i].setText("Website Category = "
                + websiteElement.getAttribute("category"));

        layout.addView(name[i]);
        layout.addView(website[i]);
        layout.addView(category[i]);

    }

暫無
暫無

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

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