Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XmlPullParser getText返回奇怪的元素内容_Java_Android_Xml_Mobile - Fatal编程技术网

Java XmlPullParser getText返回奇怪的元素内容

Java XmlPullParser getText返回奇怪的元素内容,java,android,xml,mobile,Java,Android,Xml,Mobile,我正在开发一个读写XML的android应用程序。毫无疑问,这不是一个花哨的应用程序。我正在使用XmlPullParser来读取/解析XML文件。调用getText时,我得到的是一个奇怪的值,而不是XML文件中的值。我开始拔出我的头发来解决这个问题 应用程序非常简单。我有五个编辑框,允许用户输入字母数字数据。按下保存按钮后,数据将以XML格式保存到本地文件中。XML格式不正确,因为它没有声明 XML文件看起来像 <TESTXML> <Something1>value<

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

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

XML文件看起来像

<TESTXML>
<Something1>value</Something1>
<Something2>value</Something2>
<Something3>value</Something3>
</TESTXML>
我使用RandomAccessFile将XML数据写入本地文件

在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();
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…”


有什么想法吗

你为什么要为布尔人烦恼?通过执行以下操作,可以显著缩短代码:

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中,这样您就可以真正看到在解析时是否出现了错误。

为什么您要为布尔值而烦恼?通过执行以下操作,可以显著缩短代码:

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文件内容吗?!我正在一个已经扎根的Nexus7上测试这个应用程序。我已经通过FX文本编辑器打开了XML文件,它显示了有效的XML。这几乎就像我在EditText控件和XML值之间有某种类型的绑定一样。这似乎是正确的。运行代码后,您能检查xml文件内容吗?!我正在一个已经扎根的Nexus7上测试这个应用程序。我已经通过FX文本编辑器打开了XML文件,它显示了有效的XML。这几乎就像我在EditText控件和XML值之间有某种类型的绑定一样,我只是出于测试目的使用布尔值。代码效率很低,但我希望在修改功能以提高效率之前,解析能够正常工作。我实施了建议的更改,但问题仍然存在。我想验证我的应用程序中的XML创建是否是问题的原因,因此我删除了XML文件并手动创建了它。不幸的是,结果与之前相同,它可以到达XML中的适当节点,但解析器中的文本字段包含奇怪的值。很难说。你已经调试过了吗?遍历整个链并检查您的值:您从EditText中得到了什么,您序列化了什么值,它们是否真的存在于编写的XML中,然后调试解析器中的每一行。也许可以尝试为XML设置适当的名称空间和编码(UTF-8)。另外,您正在为每个标记设置默认名称空间,请检查是否有必要。在文本标记的“startTag()”中,尝试将第一个参数设置为null,而不是空字符串。只是想法。。顺便说一句,使用“startDocument(字符串编码,布尔独立)”进行正确的XML声明。如果希望声明作为独立行,可以使用UTF-8编码,第二个参数为true。检查文档:我感谢所有的想法。如果是C++或C语言,我几分钟就可以完成。但我是Android开发的新手。在做额外的测试/调试时,我发现了一些有趣的东西。我手动修改了XML,使其包含一个具有伪值的伪节点。解析XML后,代码返回正确的结果(文件中的结果)。问题似乎与从EditText字段派生或将填充到EditText字段的XML中的值有关。顺便说一句,缺少XML声明是故意的。在某个时候,来自此应用程序的XML将被吸收到第三方应用程序中。第三方应用程序不支持XML声明。我使用布尔值仅用于测试目的。代码效率很低,但我希望在修改功能以提高效率之前,解析能够正常工作。我实施了建议的更改,但问题仍然存在。我想验证我的应用程序中的XML创建是否是问题的原因,因此我删除了XML文件并手动创建了它。不幸的是,结果与之前相同,它可以到达XML中的适当节点,但解析器中的文本字段包含奇怪的值。很难说。你已经调试过了吗?遍历整个链并检查您的值:您从EditText中得到了什么,您序列化了什么值,它们是否真的存在于编写的XML中,然后调试解析器中的每一行。也许可以尝试为XML设置适当的名称空间和编码(UTF-8)。另外,您正在为每个标记设置默认名称空间,请检查是否有必要。在文本标记的“startTag()”中,尝试将第一个参数设置为null,而不是空字符串。只是想法。。顺便说一句,使用“startDocument(字符串编码,布尔独立)”进行正确的XML声明。如果希望声明作为独立行,可以使用UTF-8编码,第二个参数为true。检查文件