-->

Android的org.xmlpull.v1.XmlPullParserException而XML解

2019-06-23 11:11发布

我有一个情况我调用Web服务并返回我在一个XML信封一些HTML。 喜欢:

<xml version="1.0" cache="false">
<head/>
<body>
<table>
<tr>
   <td>
        <a href="link-to-prev-post">
           <text color="red"><< Prev</text>
        </a>
   </td>
   <td>
        <a href="link-to-next-post">
           <text color="red">| Next >></text>
        </a>
   </td>
</tr>
</table>
</body>
</xml>

我要检索链接到上一张,后链接到下一个帖子的链接..所以我可以通过这些链接获取更多的数据。

我使用XmlPullParser解析上面提供的XML / HTML。 要获得下一个/上一个项目的联系,我在做什么,如下所示:

if (xmlNodeName.equalsIgnoreCase("a")) {
                link = parser.getAttributeValue(null, "href");

            } else if (xmlNodeName.equalsIgnoreCase("text")) {
                color = parser.getAttributeValue(null, "color");

                if (color.equalsIgnoreCase("red") && parser.getEventType() == XmlPullParser.START_TAG) {
                        // check for next/prev blog entries links
                        // but this parser.nextText() throws XmlPullParserException
                        // i think because the nextText() returns << Prev which the parser considers to be wrong
                        String innerText = parser.nextText();
                        if (innerText.contains("<< Prev")) {
                            blog.setPrevBlogItemsUrl(link);                             
                        } else if (innerText.contains("Next >>")) {
                            blog.setNextBlogItemsUrl(link);
                        }
                    }

                    link = null;
                }
            }

它抛出XmlPullParserExceptionparser.nextText()的执行......和文本元素在这个时间的价值是<<上一页 ..我认为这误解,因为存在<<文本与开始标记,这个值..

logcat的细节是:

04-08 18:32:09.827: W/System.err(688): org.xmlpull.v1.XmlPullParserException: precondition: START_TAG (position:END_TAG </text>@9:2535 in java.io.InputStreamReader@44c6d0d8) 
04-08 18:32:09.827: W/System.err(688):  at org.kxml2.io.KXmlParser.exception(KXmlParser.java:245)
04-08 18:32:09.827: W/System.err(688):  at org.kxml2.io.KXmlParser.nextText(KXmlParser.java:1382)
04-08 18:32:09.827: W/System.err(688):  at utilities.XMLParserHelper.parseBlogEntries(XMLParserHelper.java:139)
04-08 18:32:09.827: W/System.err(688):  at serviceclients.PlayerSummaryAsyncTask.doInBackground(PlayerSummaryAsyncTask.java:68)
04-08 18:32:09.827: W/System.err(688):  at serviceclients.PlayerSummaryAsyncTask.doInBackground(PlayerSummaryAsyncTask.java:1)
04-08 18:32:09.836: W/System.err(688):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-08 18:32:09.836: W/System.err(688):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-08 18:32:09.836: W/System.err(688):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-08 18:32:09.836: W/System.err(688):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
04-08 18:32:09.836: W/System.err(688):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
04-08 18:32:09.836: W/System.err(688):  at java.lang.Thread.run(Thread.java:1096)

我希望我已经澄清了我的问题。

通过Isnpired 马丁的接收到的数据转换第一个字符串的方法,我管理我的问题,是一种混合的方法。

  1. 的接收到的InputStream值转换为字符串,取而代之的是*错误的字符(或任何你想):如下

     InputStreamReader isr = new InputStreamReader(serviceReturnedStream); BufferedReader br = new BufferedReader(isr); StringBuilder xmlAsString = new StringBuilder(512); String line; try { while ((line = br.readLine()) != null) { xmlAsString.append(line.replace("<<", "*").replace(">>", "*")); } } catch (IOException e) { e.printStackTrace(); } 
  2. 现在我有一个包含正确的XML数据(我的情况)的字符串,因此就使用正常XmlPullParser解析它,而不是手动解析它自己:

     XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(false); XmlPullParser parser = factory.newPullParser(); parser.setInput(new StringReader(xmlAsString.toString())); 

希望这可以帮助别人!

Answer 1:

是的,异常被抛出可能,因为这是无效的XML作为每节2.4字符数据和标记的XML 1.0规范:

[...]左尖括号(<)不能出现在[其]字面的形式,[...]

如果你把在Eclipse中XML时,Eclipse会抱怨XML是无效的。 如果你能解决这个Web服务,你应该,或者通过使用实体引用,如修复生成的XML &lt; 或通过使用CDATA 。

如果你有过网络服务没有动力,我认为最简单的将是该手动解析了一些自定义代码,可能使用正则表达式 ,这取决于你如何轻松一般性的要求有。

示例代码

这里是你如何能解析XML文件之上。 请注意,你可能想提高这个代码,使其更通用,但是你应该有一些开始有至少:

    // Read the XML into a StringBuilder so we can get get a Matcher for the
    // whole XML
    InputStream xmlResponseInputStream = // Get InputStream to XML somehow
    InputStreamReader isr = new InputStreamReader(xmlResponseInputStream);
    BufferedReader br = new BufferedReader(isr);
    StringBuilder xmlAsString = new StringBuilder(512);
    String line;
    try {
        while ((line = br.readLine()) != null) {
            xmlAsString.append(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    // Look for links using a regex. Assume the first link is "Prev" and the
    // next link is "Next"
    Pattern hrefRegex = Pattern.compile("<a href=\"([^\"]*)\">");
    Matcher m = hrefRegex.matcher(xmlAsString);
    String linkToPrevPost = null;
    String linkToNextPost = null;
    while (m.find()) {
        String hrefValue = m.group(1);
        if (linkToPrevPost == null) {
            linkToPrevPost = hrefValue;
        } else {
            linkToNextPost = hrefValue;
        }
    }

    Log.i("Example", "'Prev' link = " + linkToPrevPost + 
            " 'Next' link = " + linkToNextPost);

有了您的XML文件,输出到logcat的会

I/Example (12399): 'Prev' link = link-to-prev-post 'Next' link = link-to-next-post


文章来源: Android org.xmlpull.v1.XmlPullParserException while parsing XML