【问题标题】:XmlResourceParser.getText() drops text after single quote char, ignores double quotesXmlResourceParser.getText() 在单引号字符后丢弃文本,忽略双引号
【发布时间】:2018-02-04 06:05:38
【问题描述】:

目前正在尝试实现我的 iOS 应用程序的 Android 版本,并在解析 XML 时遇到一些问题,其中文本包含单引号或双引号字符(它是外语的字典应用程序)。

我的应用程序的所有数据都是从 XML 资源文件加载的。这是该文件的示例:

<entry>
    <word>afa'i fā</word>
    <definition>See under "afa". Figurative (especially in poetry), king or queen: "hotau afa'i fā".</definition>  
</entry>

我通过调用检索XmlResourceParser

XmlResourceParser parser = getResources().getXml(R.xml.data);
parse(parser);

这是我的解析代码:

public void parse(XmlResourceParser parser) throws XmlPullParserException, IOException {
    int eventType = parser.getEventType();
    while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
            case XmlPullParser.START_TAG:
                startTag(parser.getName(), parser);
                break;
            case XmlPullParser.END_TAG:
                endTag(parser.getName(), parser);
                break;
            case XmlPullParser.TEXT:
                foundText(parser.getText());
                break;
            default:
                break;
        }
        eventType = parser.next();
    }
}

在解析文本时,XmlResourceParsergetText() 方法会删除 ' 之后的所有内容,并使用下一个节点内的文本重新拾取。此外,它只是忽略了双引号。我的结果如下所示:

(word) 
afa

(definition)
See under afa. Figurative (especially in poetry), king or queen: hotau afa

我浏览了文档,似乎在文档中找不到任何关于处理单引号和双引号的内容...我唯一能想到的是 XmlResourceParser 不喜欢文字字符而是期待实体代码,但我尝试将它们换掉,但它仍然忽略它们。

【问题讨论】:

  • 尝试在单引号前使用“\”。所以现在你的文本将是 afa\'i fā
  • @MashukKhan XML 文本中的'" 没有什么特别之处。逃避是不必要的。即使是这样,正确的转义也将分别是 &amp;apos;&amp;quot;
  • @ngoue 你是怎么得到这个输出的?解析器可以将文本分解为多个文本事件。
  • @Henry 我也有同样的想法——但我的 while/switch 是为处理每一个 TEXT 事件而构建的,在 foundText 中,我总是从以前的文本中构建一个字符串,并结合任何新的文本(即setText(previousText + newText)
  • 使用调试器手动进行单步调试,我可以确认我没有遗漏任何文本事件——解析器只是没有在(包括)单引号之后报告任何文本...

标签: java android xml android-xmlpullparser


【解决方案1】:

根据文档,getResources().getXml() 返回的 XmlResourceParser 似乎正在做一些额外的事情:

https://developer.android.com/reference/android/content/res/Resources.html#getXml(int)

返回一个 XmlResourceParser,您可以通过它读取给定资源 ID 的通用 XML 资源。

此处返回的 XmlPullParser 实现具有一些有限的功能。特别是,您无法更改其输入,并且只有高级解析事件可用(因为文档是在构建时为您预先解析的,这涉及合并文本和剥离 cmets)。

虽然它没有明确说明单引号或双引号,但它显然是在对 XML 做一些事情。在不更改我的任何代码来解析 XML 的情况下,我通过使用以下内容初始化我自己的 XmlPullParser 来获得所需的输出:

InputStream in = getResources().openRawResource(R.raw.data);
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, null);
parse(parser);

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2017-08-08
    • 2011-12-25
    相关资源
    最近更新 更多