【问题标题】:XMLPullParser parser failed to parse "(??????) [????] ·" inside xml tagXMLPullParser 解析器无法解析 "(??????) [????] ·" inside xml 标签
【发布时间】:2013-02-13 03:24:12
【问题描述】:

我正在使用 Jsoup 解析 XMLPullParser

<title>(??????) [????]0 BLACK LAGOON -???? &middot; ????- ?01-09?</title>
        <guid isPermaLink='true'>http://fenopy.eu/torrent/+black+lagoon+A+01+09+/OTcyOTA3Mw</guid>
        <pubDate>Wed, 27 Feb 2013 11:00:04 GMT</pubDate>
        <category>Anime</category>
        <link>http://fenopy.eu/torrent/+black+lagoon+A+01+09+/OTcyOTA3Mw</link>
        <enclosure url="http://fenopy.eu/torrent/-BLACK-LAGOON-01-09-/OTcyOTA3Mw==/download.torrent" length="569296173" type="application/x-bittorrent" />
        <description><![CDATA[ Category: Anime<br/>Size: 542.9 MB<br/>Ratio: 0 seeds, 3 leechers<br/> ]]></description>
        </item>

这是我的解析代码

int eventType = -1;

            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                // at start of document: START_DOCUMENT
                case XmlPullParser.START_DOCUMENT:                      
                    break;

                // at start of a tag: START_TAG
                case XmlPullParser.START_TAG:
                    // get tag name
                    String tagName = parser.getName();


                    if (tagName.equalsIgnoreCase(TAG_TITLE))                            
                        String t = parser.nextText();

当我调用下一个文本并引发以下异常时..

org.xmlpull.v1.XmlPullParserException: unresolved: &middot; (position:TEXT (??????) [????] ...@36:59 in java.io.StringReader@40540698) 
at org.kxml2.io.KXmlParser.exception(KXmlParser.java:273)
at org.kxml2.io.KXmlParser.error(KXmlParser.java:269)
at org.kxml2.io.KXmlParser.pushEntity(KXmlParser.java:818)
at org.kxml2.io.KXmlParser.pushText(KXmlParser.java:849)
at org.kxml2.io.KXmlParser.nextImpl(KXmlParser.java:354)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:1378)
at org.kxml2.io.KXmlParser.nextText(KXmlParser.java:1432)

【问题讨论】:

    标签: java exception xml-parsing


    【解决方案1】:

    您的 xml 无效。 &amp;middot; 对 xml 的引用无效。

    XML 中有 5 个预定义的实体引用:

    &amp;lt;

    &amp;gt;> 大于

    &amp;amp; & &

    &amp;apos;'撇号

    &amp;quot;" 引号

    更新

    简单地使用正则表达式替换 XML 中的所有 HTML 字符

    XMLString.replaceAll("(&[^\\s]+?;)", ""));
    

    这会将&amp;middot; 替换为“”

    【讨论】:

    • 是的,但是 xml 的无效字符太多了。那么它应该自动做些什么......比如设置一些功能 XmlPullParser.FEATURE_PROCESS_DOCDECL 你知道吗?
    • 恐怕,这个引用超出了 xml 规范,它们来自 html 规范。正如我所看到的,您有混合 xml 和 html 的文件。有一个方法 defineEntityReplacementText 可以定义实体引用的替换,但你应该定义你拥有的每个引用。有html实体列表en.wikipedia.org/wiki/…
    • 你能为我写一个正则表达式来删除所有以 & 开头和以 ; 结尾的单词吗?
    • 有类似的问题stackoverflow.com/questions/10438694/…,请问可以用那个解决方案吗?
    • 或者你可以使用 apache commons lang 库。方法 StringEscapeUtils.unescapeHtml4 将实体引用转换为 unicode 字符,但您应该注意编码。
    【解决方案2】:

    也许你可以这样做:

    parser.setInput(...);
    parser.defineEntityReplacementText("middot", "•");
    

    因为这不适用于您的实现:

    从 apache commons-lang 使用 HTML 转换,因为它似乎是 HTML 命名实体:

    String xml = "<foo>Hello &middot; World!</foo>";
    xml = StringEscapeUtils.unescapeHtml(xml);
    

    评论的问题:

    替换一切乱码:

    String xml = "<...";
    
    // Place all entities like "&middot;" in square brackets: "[middot]":
    xml = xml.replaceAll("\\&(\\w+);", "[$1]");
    
    // But not for the xml entities:
    xml = xml.replaceAll("\\[(lt|gt|amp|quot|apos)\\]", "&$1;");
    

    【讨论】:

    • 我在设置输入后这样做了,但这没有效果。您是否知道有关设置 XmlPullParser.FEATURE_PROCESS_DOCDECL 以使其不会在此类元素上引发异常...
    • 对不起,没有。您正在考虑首先添加前缀 &lt;?xml version="1.0"?&gt;&lt;!DOCTYPE title [ &lt;!ENTITY middot '.'&gt; ]&gt;... 吗?也许在 setInput 之前(我的实现不是这样)?
    • 我想从 XML 中删除所有无效字符。是否有任何正则表达式或任何库可以这样做..因为我想删除所有这些。
    【解决方案3】:

    我正在处理同样的问题,我找到了超级简单的解决方案:

    xmlPullParser.setFeature(Xml.FEATURE_RELAXED, true);
    

    【讨论】:

    • 明确一点:import android.util.Xml; ... XmlPullParser 解析器 = factory.newPullParser(); parser.setFeature(Xml.FEATURE_RELAXED, true);
    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多