【问题标题】:How to parse and render a complex XML document in Android?如何在 Android 中解析和渲染复杂的 XML 文档?
【发布时间】:2013-03-22 23:13:18
【问题描述】:

我想制作一个应用程序,从 web 中获取需要解释和呈现的 XML 文档,例如:

<doc>
    <entity type="person">You</entity> can also look at <ref to="A">A</ref> or <ref to="B">B</ref>.
</doc>

文档有一个相当复杂的 DTD 和一个非静态的结构,并且可能包含数千个标签。

假设我希望将ref 元素呈现为可点击元素,并暂时忽略其他标签(仅将它们显示为普通文本)。

我是否应该使用XmlPullParser 扫描文件,从文档中创建一个内部数据结构并为所有文本序列创建TextViews,并使ref 标签可点击TextViews? (这是Android开发资源'Parsing XML Data'中描述的方法。)

或者,将文档转换为 HTML 并使用WebView 是否更好,性能和用户体验更好?或者做一些其他的解析技巧,比如使用SimpleXML而不是XmlPullParser来反序列化XML?

【问题讨论】:

  • 将输入转换为 HTML 并在 WebView 中显示;)
  • 呃...使用 Android 已经用于 UI 的 XML...?
  • 所以您的意思是加载 XML 文档并将其转换为 Android 布局 (XML) 文档并在运行时对其进行扩充?您认为这是否有效,尤其是当您的文档包含数千个标签时?
  • 为什么投反对票?对我来说,这似乎是一个非常合理的问题。
  • 这是一个完全“合法”的问题,但我怀疑这表明对 Android XML 的工作原理存在根本性的误解。有关详细信息,请参阅我的答案。

标签: android xml


【解决方案1】:

在WebView 中显示 XML 和一些 CSS 是最简单的。

或者,您可以使用 XmlPullParser 进行预处理,并且对于渲染/样式设置,您可以使用 Android 的 Html 类以及 TagHandler 的自定义实现和/或使用 Spannable 做一些事情。 (请参阅 this answer 关于使用 Spannable Strings。)使用 TextView.setText(Html.fromHtml())。

【讨论】:

    【解决方案2】:

    更大的问题是“什么时候”你这样做? apk 中的 XML 不会保留为 xml,它是已编译的,因此,在运行时加载您描述的 xml 是没有意义的,因为当一切都说完后,您将不得不将其翻译成一堆动态的显示代码。

    或者您是说您正在编写一个应用程序,该应用程序获取您的 xml,然后将其转换为您要剪切并粘贴到您的项目中的 Android 样式 UI XML?

    如果您打算简单地使用 WebView,那么您不必担心任何原生 Android UI 小部件(即 TextView),您可以以任何您希望的方式呈现 XML,但是,我怀疑这不是您想要的'问,我进一步怀疑你对 Android 的 XML 使用的性质有些困惑。

    或者您希望将您的 XML 转换为 Android 原生 XML,然后在运行时对其进行扩充? (根据文档,目前这是不可能的: “出于性能原因,视图膨胀严重依赖于在构建时完成的 XML 文件的预处理。因此,目前不可能在运行时将 LayoutInflater 与 XmlPullParser 一起用于纯 XML 文件;它只能与 XmlPullParser 一起使用从已编译资源(R.something 文件)返回。” read more here)。

    我认为您需要稍微澄清一下您的问题才能获得有用的答案。

    【讨论】:

    • 今晚有很多人投反对票...这是怎么回事?无论如何,我是说我想将通过 Web 服务获得的 XML 转换为 Android 视图,并且因为有很多标签,我想知道什么是有效的,以及是否有什么我应该注意的。就是这样。
    • 我理解您的愿望,但是,这是不可能的。您唯一的选择是创建您自己的解析器/渲染器,它会遍历您的 XML 并根据您的 XML 定义手动添加视图(任何类型)。那么问题就变成了,你正在构建什么样的 UI,你可以用 HTML 来构建它(并在 WebView 中显示它),因为这种方法不那么繁琐。如果不是,您将不得不非常认真地考虑如何在自己的环境中模拟 android XML,以便涵盖所有基础。
    • Ehhhh,我知道这是可能的,因为 XML parser example 就是这样做的。我只是说,有多种可能性,我想知道在我的情况下最好的一种。
    • 您的问题明确指出您要为所有相关文本位创建 TextViews。那么,您打算如何布置这些文本视图呢?我的建议是基于这样的假设,即您希望您的应用程序实际上做一些有用的事情,而不仅仅是解析一些 XML(这当然 * 是可能的,这不是我所说的不可能)。您提出的解决方案不会按照您的问题所说的那样做。
    • 我要问的是“我应该扫描文件 [...] 并为所有文本序列创建 TextViews 吗?”因为我知道这是我的整体问题“我应该如何呈现一个非常复杂的 XML 文档?”的一种可能的解决方案。我知道如果我对每个 XML 标记都有一个单独的 TextView,那么视图层次结构会很疯狂。我最终会得到数千个同级 TextView。所以我转向 StackOverflow 寻求建议。看看是否有另一种方式,那就是:使用 TagHandler 在单个 TextView 中处理样式。显然,我在这方面太含蓄了,很抱歉造成混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多