Android的 - 读取XML的问题 [英] Android - Reading XML issues

查看:155
本文介绍了Android的 - 读取XML的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经得到了消耗返回数据的XML字符串.NET Web服务的应用程序。我试图读取该XML并将其插入到本地的SQLite数据库,但我遇到了一些麻烦。下面是XML的示例:

I've got an app that consumes a .NET web service which returns an XML string of data. I'm trying to read this XML and insert it into the local SQLite DB but I'm having some trouble. Here's a sample of the xml:

<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="RemoteWebService"><OpenIssues> <Table> <IssueID>15351</IssueID>   <IssueSummary>Computer keeps crashing. This continues to be a problem</IssueSummary> <LocationName>West Side</LocationName> <Status>WIP</Status> <CustomerID>89755</CustomerID> <CustomerName>West Side Computers</CustomerName> <CustomerShortName>WSC</CustomerShortName> <Notes /> <STATUS1>Work In Progress</STATUS1> <SubmittedBy>WSC - Tom Johns</SubmittedBy> <EQ_Replaced>true</EQ_Replaced></Table> </OpenIssues></string> 

使用DOM

,我试图分析的结果,像这样:

Using DOM, I'm trying to parse the results like so:

private void GetLatestData(String response) throws ParserConfigurationException, SAXException, IOException{

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new InputSource(new StringReader(response)));

    //Normalize the document.
    doc.getDocumentElement().normalize();

    //Get Root Node.
    NodeList nodeList = doc.getElementsByTagName("Table");
    Node node = nodeList.item(0);

    //Get Child Nodes.
    for(int i = 0; i < node.getChildNodes().getLength(); i++){
        IssueInfo issue = new IssueInfo();
        Node tempNode = node.getChildNodes().item(i);

        if(tempNode.getNodeName().equalsIgnoreCase("IssueID")){
            issue.setIssueNumber(Long.parseLong(tempNode.getTextContent()));
        }

        if(tempNode.getNodeName().equalsIgnoreCase("IssueSummary")){
            issue.setIssueNumber(Long.parseLong(tempNode.getTextContent()));
        }               

        if(issue.getIssueNumber() > 0 && issue.getIssueSummary() != null){
            creator = new IssueInfoCreator(this, DBVersion);
            creator.open();
            creator.InsertIssue(issue.getIssueNumber(), DateFormat.getDateInstance().format(new Date()), issue.getIssueSummary());
            creator.close();
        }
    }
}

当我通过调试器中运行它,它就会IssueID得很好,但我怎样才能得到它的头下一个节点IssueSummary后正确的,所以我可以一次插入数据?好像我需要另一个回路的某处,只是不太清楚的地方,虽然。

When I run it through the debugger, it gets "IssueID" just fine but how can I get it to pickup the next node "IssueSummary" right after that so I can insert the data at once? It seems like I need another loop somewhere, just not too sure where though.

推荐答案

终于找到了解决这一与我的同事的帮助和一些周围挖。应该指出的是,我们改变返回了DataSet.GetXml()的字符串到XmlDocument.InnerXml WebService的。此除去空间中的节点之间的,然后,我们能够从那里向前移动。下面是我们最后使用的code:

Finally found the resolution to this with the help of my coworker and some digging around. It should be noted that we changed the WebService that returned a string from DataSet.GetXml() to an XmlDocument.InnerXml. This removed the spaces in between the nodes and then we were able to move forward from there. Here's the final code we used:

public void GetLatestData(SoapPrimitive xml)throws ParserConfigurationException, SAXException, IOException{
    //get the factory
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    //Using factory get an instance of document builder
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc;

    //parse using builder to get DOM representation of the XML file
    InputSource is = new InputSource(new StringReader(xml.toString()));
    doc = db.parse(is);

   //Clear out Issues table first.
   creator = new IssueInfoCreator(this, DBVersion);
   creator.open();
   creator.ClearIssueTable();
   creator.close();

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

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

       Element e = (Element)nodes.item(i);

       issue.setIssueNumber(Long.parseLong(XMLfunctions.getValue(e, "IssueID")));
       issue.setIssueSummary(XMLfunctions.getValue(e, "IssueSummary"));
       issue.setDateReceived(DateFormat.format("MM/dd/yyyy hh:mm:ss", System.currentTimeMillis()).toString());

       if(issue.getIssueNumber() > 0 && issue.getIssueSummary() != null){
           creator = new IssueInfoCreator(this, DBVersion);
           creator.open();
           creator.InsertIssue(issue.getIssueNumber(), issue.getDateReceived(), issue.getIssueSummary());
           creator.close();
       }
   }
}

这里是XMLfuntions类的getValue方法:

And here is the getValue method of the XMLfuntions class:

public static String getValue(Element item, String str) {       
    NodeList n = item.getElementsByTagName(str);        
    return XMLfunctions.getElementValue(n.item(0));
}

 public final static String getElementValue( Node elem ) {
     Node kid;
     if( elem != null){
         if (elem.hasChildNodes()){
             for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){
                 if( kid.getNodeType() == Node.TEXT_NODE  ){
                     return kid.getNodeValue();
                 }
             }
         }
     }
     return "";
 }

绝对不是以信用为这,我发现在这里:
程序员XR 并修改它我的需要。

希望这将帮助其他人了!

Hopefully this will help other people out!

这篇关于Android的 - 读取XML的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆