kxml2解析简单的XML

问题描述:

我想解析我的j2me应用程序中的简单XML文件。但分析失败:kxml2解析简单的XML

XML文件

<companies> 
     <company CompanyId="6"> 
      <CompanyName>Test Company 1</CompanyName> 
      <SapNumber>0</SapNumber> 
      <RootCompanyId>1</RootCompanyId> 
      <ParentCompanyId /> </company> 
    </companies> 

分析器片段

KXmlParser parser = new KXmlParser(); 
    parser.setInput(new InputStreamReader(new ByteArrayInputStream(input.getBytes()))); 
    parser.nextTag(); 
    parser.require(XmlPullParser.START_TAG, null, "companies"); 

    while(parser.nextTag() == XmlPullParser.START_TAG) 
    { 
     Company temp_company = new Company(); 
     parser.require(XmlPullParser.START_TAG, null, "company"); 
     String CompanyID = parser.getAttributeValue(0); 
     temp_company.putValue("CompanyId", CompanyID); 
     while(parser.nextTag() == XmlPullParser.START_TAG) 
     { 
      if(parser.getName() == "CompanyName") 
      { 
       temp_company.putValue("CompanyName", parser.nextText()); 
      } 
     } 
     parser.require(XmlPullParser.END_TAG, null, "company"); 
     listCompany.put(CompanyID, temp_company); 
    } 
    parser.require(XmlPullParser.END_TAG, null, "elements"); 
+0

解析失败如何?你有例外吗? – kgiannakakis 2009-07-21 12:28:18

我想我可以看到是怎么回事错在这里。在匹配<company>标签并获得CompanyId属性的值后,您将输入一个while循环。但观察在这一点上会发生什么:

  1. 你执行,而条件下的第一次,分析器将匹配<CompanyName>开始标记,因此如果条件将是真实的,你会得到里面的文本标签。
  2. 我不KXML的内部工作过于亲密,但是,从第二次迭代解析器状态必须是在文本节点指向(也就是<CompanyName>标签内),或在结束标记(即</CompanyName>)。无论哪种方式,你条件会失败,因为你不在开始标签。
  3. 此时您需要下一个标签为<company>的结束标签,但是,您的状态仍未更改,因此不会得到满足。

我最好的猜测是,内部指针在里面<CompanyName>文本节点指向,这就是为什么你得到"unexpected type (position: Text: Test Company1..."消息。