kxml2 解析简单 XML

发布于 2024-07-27 15:14:22 字数 1386 浏览 2 评论 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");

I'm trying to parse a simple XML file in my j2me application. But the parsing fails:

XML File

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

Parser Snippet

    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");

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一向肩并 2024-08-03 15:14:22

我想我可以看到这里出了什么问题。 匹配 标记并获取 CompanyId 属性的值后,您将进入 while 循环。 但观察此时会发生什么:

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

我最好的猜测是内部指针指向 内的文本节点,这就是为什么您得到 " 意外类型 (position: Text :测试 Company1...”消息。

I guess I can see what is going wrong here. After you have matched the <company> tag and obtained the value of the CompanyId attribute, you enter a while loop. But observe what will happen at this point:

  1. The first time you execute the while condition, the parser will match the <CompanyName> start tag, thus the if condition will be true and you will obtain the text inside the tag.
  2. I am not too intimate with the inner workings of kXml but on the second iteration your parser state must be either pointing at the text node (that is inside the <CompanyName> tag) or at the end tag (ie. </CompanyName>). Either way, you while condition will fail because you are not at a start tag.
  3. At this point you require that the next tag be the end tag of <company>, however, your state has still not changed and this will not be satisfied.

My best guess is that the internal pointer is pointing at the text node inside <CompanyName> and that is why you get the "unexpected type (position: Text: Test Company1..." message.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文