XML 解析器:快速将元素内的所有内容解析为文本?

XML parser: quick way to parse everything inside an element as text?

提问人:eastwater 提问时间:6/27/2023 更新时间:6/27/2023 访问量:69

问:

XML 解析器:快速将元素内的所有内容解析为文本?例如,

<foo>
    text
    <bar>
        <![CDATA[ ... ]]>
        <hello><world></world>
        </hello> 
    </bar
    text
</foo>

如何解析 as 文本中的所有内容,就好像它被包裹起来一样<foo><![CDATA[ ]]>.

这样做的原因是它已经嵌套了。嵌套 CDATA 使人工读/写变得更加困难。<![CDATA[ ]]>.

SAXParser/StreamParser 使用回调或事件,元素/属性/文本需要连接在一起。有没有更有效的方法?

有没有办法告诉 XML 解析器将元素内的所有内容都视为 TEXT?XML 架构可以做到吗?

Java XML XML 解析 CDATA

评论

0赞 LMC 6/27/2023
请花一些时间阅读如何提问如何创建一个最小的、可重复的例子。使用 jaxB 进行解析是一种选择。请添加到目前为止的 java 代码和预期输出。

答:

0赞 John Bollinger 6/27/2023 #1

你问......

有没有办法告诉 XML 解析器将元素内的所有内容都视为 TEXT?XML 架构可以做到吗?

...你的意思

如何将 <foo> 中的所有内容解析为文本,就好像它被 .<![CDATA[ ]]>

.这意味着你会得到一个包含以下文字内容的结果字符串:*

    text
    <bar>
        <![CDATA[ ... ]]>
        <hello><world></world>
        </hello> 
    </bar
    text

也就是说,包括所有空格和所有标记、注释、处理指令和 CDATA 部分的文本表示形式。我无法将其与...

这样做的原因是它已经嵌套了..嵌套 CDATA 使人类更难读/写。<![CDATA[ ]]>

.也就是说,我不反对 CDATA 部分难以阅读,但我不明白这如何建议创建包含 CDATA 部分文本版本的字符串。

我也很难用...

SAXParser/StreamParser 使用回调或事件,元素/属性/文本需要连接在一起。有没有更有效的方法?

...因为 SAXParser 不允许你按照你的要求去做。尽管可以使用 SAX 回调来重新构造已分析的 XML 的文本表示形式,但不会

  • 将 CDATA 部分复制为文本(仅其内容),
  • 确保逐字复制标签(SAX 不传达内部空格、属性引号类型和空标签的表示样式),
  • 避免在文本和属性值中(但在 CDATA 部分之外)至少扩展一些实体引用,或者
  • 保留评论。

可能还有其他问题。如果您的目标是执行某种 XML 清理以提高人类的可读性,那么请注意,此类过程发出的字符串不构成格式正确的 XML 元素内容的风险相当高。毕竟,CDATA 部分和许多实体引用的目的之一正是表达如果按字面意思表达会使文档格式不正确的内容。该转义函数将丢失,因此,如果您希望能够将内容重新解析为 XML,则需要重新转义内容。


如果您确实想要提取 XML 元素的原始文本,那么,据我所知,没有 XML API 提供它,并且 XML 架构无法做到这一点。XML 技术适用于文档结构,但您似乎希望覆盖文档结构。您可能需要编写自己的 XML 解析器,如果这实际上是您想要执行的操作。


*或者至少,这是我对你的意思的最佳猜测。CDATA 部分不嵌套,因此,如果从字面上将包含原始元素文本的 CDATA 文本包装在 CDATA 部分中,则结果的 XML 解释将有所不同,并且不太可能是您真正想要的。

评论

0赞 eastwater 6/27/2023
感谢您的详细回复。foo 元素中的内容是包含 XML 片段的任意文本。文本和 XML 片段将由处理器进一步处理,XML 片段稍后将解析为 XML 文档。
0赞 John Bollinger 6/27/2023
@eastwater,如果您计划使用标准 XML 解析器对此进行解析,并且如果 的内容旨在将其全部作为第二级 XML 解析的文本输入,则需要相对于初始解析正确转义该内容。这应该在写入数据时完成,尽管它可以在某种非基于XML的后处理步骤中完成。在分析数据时,任何标准 XML 解析器都无法完成此操作。<foo>
0赞 John Bollinger 6/27/2023
将整个内容放在 CDATA 部分中是一种方法,前提是数据不包含自己的任何 CDATA 部分,因为这些部分不嵌套。如果数据可能包含 CDATA 部分,那么您仍然可以使其工作,但它更复杂。例如:stackoverflow.com/a/13562589
0赞 eastwater 6/28/2023
我们更改了文件格式以避免嵌套 CDATA。谢谢。