【问题标题】:XmlPullParser name expected exceptionXmlPullParser 名称预期异常
【发布时间】:2015-03-04 15:13:30
【问题描述】:

我尝试使用以下代码读取我的应用创建的 XML 文件:

XmlPullParser xpp = factory.newPullParser();
xpp.setInput(new StringReader(data));
int eventType = xpp.getEventType();

while(eventType != XmlPullParser.END_DOCUMENT)
{
    switch(eventType)
    {
        case XmlPullParser.START_TAG:
        {
            String tagName = xpp.getName();
            // do something
            break;
        }
        case XmlPullParser.TEXT:
        {
            // get text...
            break;
        }
        case XmlPullParser.END_TAG:
        {
            // do something
            break;
        }
    }

    eventType = xpp.next();
}

但一开始,当 eventType 为 START_DOCUMENT 时,next() 函数会抛出异常:org.xmlpull.v1.XmlPullParserException: name expected (position:START_TAG @2:2 in java.io.StringReader@41084cc8)

你知道为什么吗?

这是我的 XML 文件:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<0>
  <createTime>1419453655800</createTime>
  <editTime>1419453655800</editTime>
  <color>2</color>
  <text>ooooo</text>
</0>
<1>
  <createTime>1419453586197</createTime>
  <editTime>1419453605679</editTime>
  <color>1</color>
  <text>uuuuuuuuu</text>
</1>
<2>
  <createTime>1419453358866</createTime>
  <editTime>1419453597124</editTime>
  <color>2</color>
  <text>yyyyyyyyyy</text>
</2>

【问题讨论】:

  • 您的 XML 文档格式不正确,因为它没有单个根元素。您应该在尝试解析它之前修复它。
  • @kjhughes 好的,感谢您粘贴 XML
  • 那么,我应该将所有元素移动到一个虚拟根目录中,然后一切都会正常吗?我试试看
  • 是的,您至少需要一个根元素。 (从技术上讲,它甚至不是没有单个根元素的 XML,它需要格式正确。)如果出现任何其他问题,请告诉我们。谢谢。
  • 另外,让您的编号标签以 e1、e2 等字母开头。

标签: java android xml exception xmlpullparser


【解决方案1】:

通过给 XML well-formed 赋予单个根元素并使元素名称以字母而不是数字开头:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<top>
  <e0>
    <createTime>1419453655800</createTime>
    <editTime>1419453655800</editTime>
    <color>2</color>
    <text>ooooo</text>
  </e0>
  <e1>
    <createTime>1419453586197</createTime>
    <editTime>1419453605679</editTime>
    <color>1</color>
    <text>uuuuuuuuu</text>
  </e1>
  <e2>
    <createTime>1419453358866</createTime>
    <editTime>1419453597124</editTime>
    <color>2</color>
    <text>yyyyyyyyyy</text>
  </e2>
</top>

【讨论】:

  • 你是对的。它在数字前插入文本后起作用。但我有一个问题:当我调用 getName 函数时,我也会得到结束行和空格字符。正常吗?
  • 不,这不正常。对于 START_TAG、END_TAG 和 ENTITY_REF 事件,getName() 应返回字符串,其中不应包含空格或换行符;对于其他事件,getName() 应该返回 null。我会发布一个带有Minimal, Complete, and Verifiable Example (MCVE) 的新问题,专门显示getName() 返回EOL 和空格。
  • 你是对的。当标签没有文本(如 )时,getText() 返回“\n”。对不起,我没听懂你的最后一句话。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多