需要Android XPath帮助

时间:2011-02-24 14:20:15

标签: android xml xpath

我是Android开发的新手,我使用的是Android 2.2,因此可以选择使用XPath进行开发,我认为这是一个不错的选择。

我希望提取的代码格式为:

<?xml version="1.0" encoding="UTF-8"?> 
<ams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<?xml-stylesheet type="text/xsl" href="XSLDoc.xsl"?> 
    <toGo>

        <SMS> 
            <ID>1</ID> 
            <to>07700000008</to> 
            <body>Hi Alice, This is just a test message.</body> 
        </SMS>

        <SMS> 
            <ID>2</ID> 
            <to>07700000009</to> 
            <body>Hi Bob, This is just a test message.</body> 
        </SMS>

    </toGo> 
</ams>

我查看了XPath API,他们的Foo示例对我来说还不够好。有人使用XPath来收集这样的信息并将其存储在arraylist中吗?

如果您认为我的XML很糟糕,请随意使用您的回复/评论建议更好的结构。建设性的批评欢迎!

提前致谢,

编辑: 一次可能生成0,1,2或500+个SMS块。

2 个答案:

答案 0 :(得分:1)

感谢SamG指出我走在正确的道路上,原谅双关语。

他的回答是70%准确,如果没有他的帮助,我将无法管理它。如果其他人在解决方案之后:

ArrayList smsList = new ArrayList();

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); 
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("myXMLFile.xml");

XPath xpath = XPathFactory.newInstance().newXPath();

XPathExpression expr = xpath.compile("//SMS");

NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);    
for (int i = 0; i < nodes.getLength(); i++) {

                   NodeList items = nodes.item(i).getChildNodes();

                   String id = items.item(1).getTextContent();
                   String to = items.item(3).getTextContent();
                   String body = items.item(5).getTextContent();

                   SMS sms = new SMS(id,to,body);

                   smsList.add(sms);
                }

我不知道为什么节点被计数1,3,5而不是0,1,2。但是这个解决方案对我有用,希望将来可以帮助别人。如果其他人能够解释它为什么有效,我将非常感谢你的意见。

答案 1 :(得分:0)

我建议制作一个SMS对象并创建这些对象的ArrayList。然后,您可以使用类似的内容解析XML。

ArrayList<SMS> smsList = new ArrayList<SMS>();

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); 
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("myXMLFile.xml");

XPath xpath = XPathFactory.newInstance().newXPath();

XPathExpression expr = xpath.compile("//SMS");

NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);


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

   NodeList items = nodes.item(i).getChildNodes();

   String id = items(0).getNodeValue();
   String to = items(1).getNodeValue();
   String body = items(2).getNodeValue();
   SMS sms = new SMS(id,to,body);

   smsList.add(sms);    
}