【问题标题】:parsing XML that contain XML in elements, Can this be done解析元素中包含 XML 的 XML,可以这样做吗
【发布时间】:2010-10-05 21:56:46
【问题描述】:

我有一个 XML 格式的“复杂项目”,然后是一个包含许多其他信息的“工作项目”(xml 格式),我希望它包含一个字符串,该字符串包含 xml 中的复杂项目。

例如:

<inouts name="ClaimType" type="complex" value="<xml string here>"/>

但是,尝试 SAX 和其他 java 解析器时,我无法让它处理这一行,它不喜欢字符串中的

反正有这个吗?还是我必须想出另一个解决方案?

谢谢

【问题讨论】:

  • 是否有理由不能简单地将 XML 值作为实际 XML 包含在 元素中?
  • 澄清:值不是一个元素,它是一个属性。

标签: java xml


【解决方案1】:

我想你会发现你正在处理的 XML 不会被很多解析器解析,因为它是无效的。如果您可以控制 XML,那么您至少需要转义该属性,因此它类似于:

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

然后,一旦您提取了属性,您就可以重新解析它以将其视为 XML。

或者,您可以采用上述方法之一(使用 CDATA 部分)对您的 XML 进行一些重构。

如果您无法控制您的 XML,您可以尝试使用 TagSoup library 来解析它以查看您的操作。 (免责声明:我只将 TagSoup 用于 HTML,我不知道它如何处理非 HTML 内容)

(tag soup 网站实际上出现在 ATM 上,但你应该可以在网上找到足够的 doco,并通过maven repository 下载)

【讨论】:

    【解决方案2】:

    可能最简单的解决方案是使用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>
    

    【讨论】:

      【解决方案3】:

      CDATA 部分或escaping

      NB 转义和编码之间有很大的区别,其他一些发帖人已经提到了这一点。小心混淆两者。

      【讨论】:

        【解决方案4】:

        我不确定它对属性是如何工作的,如果转义( as >)不起作用,那么我不知道。

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

        【讨论】:

        • 编码和转义是不同的东西
        【解决方案5】:

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

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

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

        如果它实际上不能保证是格式良好的 XML,但只是看起来像它,因为你在其中放了一些尖括号,那么你应该问问自己是否有更好的方法来解决这个问题。如果失败,请使用&lt;![CDATA[,正如一些人已经建议的那样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-06
          • 2023-04-03
          • 2012-08-21
          • 2012-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多