【问题标题】:XmlPullParser getText returning strange element contentXmlPullParser getText 返回奇怪的元素内容
【发布时间】:2013-10-09 15:34:16
【问题描述】:

我正在开发一个读取和写入 XML 的 android 应用程序。毫无疑问,这不是一个花哨的应用程序。我正在使用 XmlPullParser 来读取/解析 XML 文件。当我调用 getText 时,我得到一个奇怪的值,而不是 XML 文件中的值。我开始拔掉我必须解决的问题。

应用程序非常简单。我有五个允许用户输入字母数字数据的编辑框。按下保存按钮后,数据会以 XML 格式保存到本地文件中。 XML 格式不正确,因为它没有声明。

XML 文件看起来像

<TESTXML>
<Something1>value</Something1>
<Something2>value</Something2>
<Something3>value</Something3>
</TESTXML>

在编写 XML 时,我正在执行以下操作:

String sSome1= xmlSome1EditText.getText().toString();
String sSome2= xmlSome2EditText.getText().toString();
String sSome3= xmlSome3EditText.getText().toString();

XmlSerializer xmlSerializer = Xml.newSerializer();

xmlSerializer.startTag("", "TESTXML");

xmlSerializer.startTag("", "Something1");
xmlSerializer.text("value");
xmlSerializer.endTag("", "Something1");

xmlSerializer.startTag("", "Something2");
xmlSerializer.text("value");
xmlSerializer.endTag("", "Something2");

xmlSerializer.startTag("", "Something3");
xmlSerializer.text("value");
xmlSerializer.endTag("", "Something3");

xmlSerializer.endTag("", "TESTXML");
xmlSerializer.endDocument();

我正在使用 RandomAccessFile 将 XML 数据写入本地文件。

在 XML 的读取/解析中,我正在执行以下操作:

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();

InputStream is = openFileInput("myxml.xml"); 

xpp.setInput(is);

int eventType = xpp.getEventType();

String sSome1 = "";
String sSome2 = "";
String sSome3 = "";

bool bSome1 = false;
bool bSome2 = false;
bool bSome3 = false;

while (eventType != XmlPullParser.END_DOCUMENT) 
{
    if(eventType == XmlPullParser.START_TAG) 
    {
      if( xpp.getName().equals("Something1") )
      {          
         bSome1 = true;
      } 
      else if( xpp.getName().equals("Something2") )
      {          
         bSome2 = true;
      } 
      else if( xpp.getName().equals("Something3") )
      {          
         bSome3 = true;
      } 
    }
    else if(eventType == XmlPullParser.END_TAG) 
    {
       bSome1 = false;
       bSome2 = false;
       bSome3 = false;
    } 
    else if(eventType == XmlPullParser.TEXT) 
    {
        if( bSome1 )
        {
           sSome1 = xpp.getText();
        }
        else if ( bSome2 )
        {
           sSome2 = xpp.getText();
        }
        else if ( bSome3 )
        {
           sSome3 = xpp.getText();
        }
   }

   eventType = xpp.next();
}

请原谅任何复制/粘贴错误。

我没有执行任何复杂的处理,只是简单地解析 XML。我已验证节点名称是否正确。我读过的每一篇文章都表明这种方法应该得到适当的价值。但是每次调用 getText 时,我都希望返回 XML 文件中的值,但我得到的值类似于“android.widget.EditText..”

有什么想法吗?

【问题讨论】:

  • 这似乎是正确的。运行代码后可以查看xml文件内容吗?!
  • 我正在一个已root 的原始Nexus 7 上测试该应用程序。我已经通过 FX 文本编辑器打开了 XML 文件,它显示了有效的 XML。就好像我在 EditText 控件和 XML 值之间有某种类型的绑定。

标签: java android xml mobile


【解决方案1】:

您为什么要为布尔值烦恼?这样做可以显着缩短代码:

try {
  XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  factory.setNamespaceAware(true);
  XmlPullParser xpp = factory.newPullParser();

  InputStream is = openFileInput("myxml.xml"); 

  xpp.setInput(is);

  int eventType = xpp.getEventType();

  String sSome1 = "";
  String sSome2 = "";
  String sSome3 = "";

  while (eventType != XmlPullParser.END_DOCUMENT) {
    switch(eventType) {
      case XmlPullParser.START_TAG:
        String tagName = xpp.getName();

        if (tagName.equalsIgnoreCase("Something1")) {
          sSome1 = xpp.nextText();
        }
        else if (tagName.equalsIgnoreCase("Something2")) {          
          sSome2 = xpp.nextText();
        } 
        else if (tagName.equalsIgnoreCase("Something3")) {          
          sSome3 = xpp.nextText();
        } 
        break;
    }
    eventType = xpp.next();
  }
} catch (XmlPullParserException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

请注意nextText() 而不是getText(),因为您仍在开始标签中。

试试这个,也许是因为你的实现出了问题。除此之外它应该工作。另外,请注意,我将它放在了 try/catch 中,这样您就可以实际查看解析时是否出现问题。

【讨论】:

  • 我仅将布尔值用于测试目的。代码效率非常低,但我希望在改进功能以提高效率之前让解析正常工作。我实施了建议的更改,但问题仍然存在。我想验证我的应用程序中的 XML 创建是否是问题的原因,所以我删除了 XML 文件并手动创建它。不幸的是,结果与之前相同,它可以到达 XML 中的正确节点,但解析器中的文本字段包含奇怪的值。
  • 那么很难说。你已经调试了吗?遍历整个链并检查您的值:您从 EditTexts 中获得了什么,您序列化了哪些值,它们是否真的在书面 XML 中,然后在解析器中调试每一行。也许尝试为 XML 设置正确的命名空间和编码 (UTF-8)。此外,您正在为每个标签设置默认命名空间,请检查是否有必要。为您的文本标签尝试第一个参数 null 而不是“startTag()”中的空字符串。只是想法..经历一切。
  • 顺便说一句,使用 'startDocument(String encoding, Boolean Standalone)' 来进行正确的 XML 声明。如果要将声明作为独立行,则可以使用 UTF-8 编码,第二个参数 true。查看文档:developer.android.com/reference/org/xmlpull/v1/…
  • 我很欣赏所有的想法。如果是 C++ 或 C#,我会在几分钟内完成。但我是 Android 开发的新手。在进行额外的测试/调试时,我发现了一些有趣的东西。我手动修改了 XML 以包含一个带有虚假值的虚假节点。解析 XML 后,代码返回了正确的结果(文件中的结果)。该问题似乎与 XML 中的值有关,这些值源自或将填充到 EditText 字段。
  • 顺便说一句 - 缺少 XML 声明是故意的。在某个时候,来自这个应用程序的 XML 将被摄取到第 3 方应用程序中。第 3 方应用不支持 XML 声明。
猜你喜欢
  • 1970-01-01
  • 2018-10-23
  • 2015-04-26
  • 2015-09-30
  • 2014-07-05
  • 2014-08-20
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多