0

我正在尝试在我的 j2me 应用程序中解析一个简单的 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");
4

1 回答 1

1

我想我可以看到这里出了什么问题。匹配<company>标签并获取CompanyId属性值后,进入while循环。但请注意此时会发生什么:

  1. 第一次执行 while 条件时,解析器将匹配<CompanyName>开始标签,因此 if 条件为真,您将获得标签内的文本。
  2. 我不太了解 kXml 的内部工作原理,但是在第二次迭代中,您的解析器状态必须指向文本节点(即在<CompanyName>标签内)或结束标签(即 . </CompanyName>)。无论哪种方式,您的 while 条件都会失败,因为您不在开始标记处。
  3. 此时您要求下一个标签是 的结束标签<company>,但是您的状态仍然没有改变,这不会满足。

我最好的猜测是内部指针指向内部的文本节点<CompanyName>,这就是您收到"unexpected type (position: Text: Test Company1..."消息的原因。

于 2009-07-29T11:58:23.813 回答