Разбор XML, которые содержат XML в элементах, это можно сделать - PullRequest
3 голосов
/ 06 февраля 2009

У меня есть «сложный элемент» в XML, затем «рабочий элемент» (в xml), содержащий много другой информации, и я хотел бы, чтобы в нем содержалась строка, содержащая сложный элемент в xml.

например:

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

Однако, пробуя SAX и другие java-парсеры, я не могу заставить его обрабатывать эту строку, ему не нравятся <или "в строке, я попытался экранировать и преобразовать" в ". </p>

Есть ли вообще что-нибудь вокруг этого? Или мне придется придумать другое решение?

Спасибо

Ответы [ 5 ]

5 голосов
/ 06 февраля 2009

Я думаю, вы обнаружите, что XML, с которым вы имеете дело, не будет разбираться со многими синтаксическими анализаторами, поскольку он недопустим. Если у вас есть контроль над XML, вам как минимум потребуется экранировать атрибут, так что это что-то вроде:

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

Затем, после того как вы извлекли атрибут, вы можете повторно проанализировать его, чтобы обработать его как XML.

В качестве альтернативы, вы можете воспользоваться одним из вышеперечисленных подходов (используя разделы CDATA) с некоторым перефакторингом вашего XML.

Если у вас нет контроля над вашим XML, вы можете попробовать использовать библиотеку TagSoup , чтобы проанализировать ее и посмотреть, как вы работаете. (Отказ от ответственности: я использовал только TagSoup для HTML, я понятия не имею, как он будет работать с контентом, отличным от HTML)

(Сайт супа тегов на самом деле появляется в банкомате, но вы можете найти достаточно документов в Интернете и загрузить их через maven хранилище )

5 голосов
/ 06 февраля 2009

Возможно, самым простым решением было бы использование раздела 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>

Или несколько элементов значения с идентифицирующим идентификатором:

<inouts name="ClaimType" type="complex">
  <value id="complexString1">
    <![CDATA[
      <xml string here>
    ]]>
  </value>
  <value id="complexString2">
    <![CDATA[
      <xml string here>
    ]]>
  </value>
</inouts>
2 голосов
/ 06 февраля 2009

CDATA раздел или экранирование

NB. Между экранированием и кодированием существует большая разница, о которой упоминали некоторые другие авторы. Будьте осторожны, чтобы не спутать их.

0 голосов
/ 06 февраля 2009

Вы http://www.doingitwrong.com/

Если inouts/@value действительно имеет древовидную структуру (т.е. XML), то это не должен быть атрибут, это должен быть дочерний элемент:

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

Если на самом деле это не гарантированно правильно сформированный XML, а просто выглядит так, потому что вы заключили в него некоторые заостренные скобки, то вам следует спросить себя, нет ли лучшего способа решить Эта проблема. Если это не удалось, используйте <![CDATA[, как некоторые уже предложили.

0 голосов
/ 06 февраля 2009

Я не уверен, как это работает для атрибутов, и если экранирование ( as>) не работает, то я не знаю.

Если бы это был внутренний тег: вы могли бы использовать механизм Xml Any (никогда не использовал его сам) или объявить его в разделе CDATA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...