解析包含XML元素的XML,这可行吗?

3
我是一个有用的助手,可以为您翻译文本。
我有一个在XML中的“复杂项”,然后是一个包含许多其他信息的“工作项”(在xml中),我希望它包含一个包含xml中复杂项目的字符串。
例如:
<inouts name="ClaimType" type="complex" value="<xml string here>"/>

然而,尝试使用SAX和其他Java解析器时,我无法处理此行,它不喜欢字符串中的<或" ',我尝试了转义和将"转换为'。

有没有任何方法可以解决这个问题?还是我必须想出另一个解决方案?

谢谢


你为什么不能简单地将XML值作为实际的XML包含在<inouts>元素内部呢? - James Sulak
澄清:value 不是一个元素,而是一个属性。 - Robert P
5个回答

5
可能最简单的解决方案是使用 CDATA部分。您可以将示例转换为以下内容:
<inouts name="ClaimType" type="complex">
  <![CDATA[
    <xml string here>
  ]]>
</inouts>

如果您有多个要存储复杂字符串的属性,可以使用具有不同名称的多个子元素:
<inouts name="ClaimType" type="complex">
  <value1>
    <![CDATA[
      <xml string here>
    ]]>
  </value1>
  <value2>
    <![CDATA[
      <xml string here>
    ]]>
  </value2>
</inouts>

或者使用带有标识id的多值元素:

<inouts name="ClaimType" type="complex">
  <value id="complexString1">
    <![CDATA[
      <xml string here>
    ]]>
  </value>
  <value id="complexString2">
    <![CDATA[
      <xml string here>
    ]]>
  </value>
</inouts>

5

我认为您会发现,由于无效,许多解析器无法解析您处理的XML。如果您控制XML,则至少需要转义属性,使其类似于:

<inouts name="ClaimType" type="complex" value="&lt;xml string here&gt;" />

然后,一旦你提取了属性,你可以重新解析它以将其作为XML处理。

或者,您可以采用上述某种方法(使用CDATA段),并对XML进行一些重构。

如果您无法控制XML,则可以尝试使用TagSoup库来解析它,看看结果如何。(免责声明:我只在HTML中使用过TagSoup,不知道它在非HTML内容中的表现如何)

(Tag soup网站实际上似乎已经关闭,但是您应该能够在网上找到足够的文档,并通过maven仓库下载)


2

CDATA部分或转义字符

NB:“转义”和“编码”之间有很大的区别,一些其他帖子已经提到。请注意不要混淆两者。


0

对于属性,我不确定它是如何工作的,如果转义(将 < 转义为 < 以及 > 转义为 >)无法起作用,那么我就不知道了。

如果它是一个内部标签:你可以使用 Xml Any 机制(我自己从未使用过),或在 CDATA 部分中声明它。


编码和转义是不同的事情。 - Simon

0

你是http://www.doingitwrong.com/

如果inouts/@value真的是树形结构(即XML),那么它不应该是一个属性,而应该是一个子元素:

<inout name="ClaimType" type="complex">
    <value>
        <some-arbitrary>
            <xml-stuff/>
        </some-arbitrary>
    </value>
</inout>

如果它实际上并不能保证是格式良好的XML,只是因为你在其中放了一些尖括号而看起来像是这样,那么你应该问问自己是否有更好的解决方法。如果没有,可以像一些人已经建议的那样使用<![CDATA[

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接