如何通过属性值解析XML?

时间:2018-04-10 09:17:32

标签: android xml xml-parsing nodelist

简介

我有一个摘要" country.xml"我从网站上看到的文件如下所示 我需要通过它的属性名解析这个xml。

例如,我希望有这样一个列表:

Country: Germany
Population: 82521653
GDP: 3466000000000

Country: Switzerland
Population: 8417700
GDP: 659800000000

问题是,标签名称几乎相同。

我现在拥有的

Country: Germany
Population: Germany
GDP: Germany

Country: Switzerland
Population: Switzerland
GDP: Switzerland

Country: Austria
Population: Austria
GDP: Austria

MainActivity.java

public class MainActivity extends Activity {
    TextView tv1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1=(TextView)findViewById(R.id.textView1);

        try {
            InputStream is = getAssets().open("country.xml");

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(is);

            Element element=doc.getDocumentElement();
            element.normalize();

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

            for (int i=0; i<nList.getLength(); i++) {
                Node node = nList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element2 = (Element) node;
                    tv1.setText(tv1.getText()+"\nCountry : " + getValue("string", element2)+"\n");
                    tv1.setText(tv1.getText()+"Population : " + getValue("string", element2)+"\n");
                    tv1.setText(tv1.getText()+"GDP : " + getValue("string", element2)+"\n");
                    tv1.setText(tv1.getText()+"-----------------------");
                }
            }
        } catch (Exception e) {e.printStackTrace();}
    }

    private static String getValue(String tag, Element element) {
        NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();
        Node node = nodeList.item(0);
        return node.getNodeValue();
    }
}

Country.xml

<Country>
    <string name="CountryName">Germany</string>
    <string name="Population">82521653</string>
    <null name="Area">357385</null>
    <null name="GDP">3466000000000</null>
</Country>
<Country>
    <string name="CountryName">Switzerland</string>
    <string name="Population">8417700</string>
    <null name="Area">41285</null>
    <null name="GDP">659800000000</null>
</Country>
<Country>
    <string name="CountryName">Austria</string>
    <string name="Population">8772865</string>
    <null name="Area">83878</null>
    <null name="GDP">386700000000</null>
</Country>

问题

如何通过其属性名称获取值?

我尝试的是:

tv1.setText(tv1.getText()+"\nCountry : " + getValue("string name=\"CountryName\"", element2)+"\n");

但是这给了我一个空字符串。

1 个答案:

答案 0 :(得分:1)

我认为,您无法通过属性名称directley获取元素的textContent。

但你可以这样做:

像你一样为每个国家/地区调用getValue,但为其指定正确的标记名称(例如&#34; CountryCode&#34;)。 在getValue()中,您首先获得Country元素的子节点列表。 然后,您将获取每个子节点的属性名称,并将其与标记名称进行比较。如果它相等,则返回元素的textContent。

看看这里,它的工作原理如下:

public class MainActivity extends Activity {
    TextView tv1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1=(TextView)findViewById(R.id.textView1);

        try {
            InputStream is = getAssets().open("country.xml");

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(is);

            Element element=doc.getDocumentElement();
            element.normalize();

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

            for (int i=0; i<nList.getLength(); i++) {
                Node node = nList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element2 = (Element) node;
                    tv1.setText(tv1.getText()+"\nCountry : " + getValue("CountryName", element2)+"\n");
                    tv1.setText(tv1.getText()+"Population : " + getValue("Population", element2)+"\n");
                    tv1.setText(tv1.getText()+"GDP : " + getValue("GDP", element2)+"\n");
                    tv1.setText(tv1.getText()+"-----------------------");
                }
            }
        } catch (Exception e) {e.printStackTrace();}
    }

    private static String getValue(String tag, Element element) {
        NodeList childNodes = element.getChildNodes();
        for (int i=0 ; i<childNodes.getLength() ; i++) {
            if (childNodes.item(i).hasAttributes()) {
                String attributeName = childNodes.item(i).getAttributes().item(0).getNodeValue();
                if (attributeName.equals(tag)) {
                    return childNodes.item(i).getTextContent();
                }
            }
        }
        return null;
    }
}