Обертывание произвольного XML в XML - PullRequest
5 голосов
/ 22 апреля 2009

Мне нужно встроить произвольные (синтаксически допустимые) XML-документы в XML-документ-оболочку. Встроенные документы следует рассматривать как простой текст, их не нужно разбирать при разборе документа-оболочки.

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

Ответы [ 6 ]

5 голосов
/ 22 апреля 2010

Вы можете сделать это, просто добавив документ (без его объявления <<code>?xml) как дочерний элемент к какому-либо родителю. SOAP делает это - у него есть элемент <Body>, который может содержать любое xml-сообщение, которое вы хотите отправить.

SOAP определяет XSD следующим образом:

<xs:element name="Body" type="tns:Body" />
  <xs:complexType name="Body">
    <xs:sequence>
      <xs:any namespace="##any" minOccurs="0" 
          maxOccurs="unbounded" processContents="lax" />
    </xs:sequence>
    <xs:anyAttribute namespace="##any" processContents="lax">
    </xs:anyAttribute>
  </xs:complexType>
4 голосов
/ 22 апреля 2009

Вам нужно правильно экранировать текст. Вы не говорите, какой язык используете, но обычно: вы создаете DOM, создаете узел Text, который содержит ваш «внутренний» XML, а затем сериализуете этот DOM. Сериализатор будет обрабатывать выход для вас.

Ключевым моментом здесь является , используя сериализатор для получения выходных данных. Не просто пишите строки, потому что вы гарантированно получите что-то, что не является правильно сформированным XML.

2 голосов
/ 22 апреля 2009

Когда вы выходите за конечную угловую скобку внутреннего CDATA, большинство синтаксических анализаторов XML не будут жаловаться на правильность вашего XML. Используя этот «обходной путь», вы сможете вкладывать несколько разделов CDATA.

Что-то вроде:

<?xml version="1.0"?>
<SomeData>
<![CDATA[
<SomeMoreData>
<![CDATA[
yeah, this trick rocks! ...
]]&gt;
</SomeMoreData>
]]>
</SomeData>

Обратите внимание, что у внутреннего CDATA окончание ">" экранировано как &gt;.

1 голос
/ 22 апреля 2009

Одно простое решение - у вас могут быть смежные секции CDATA. <![CDATA[A]]><![CDATA[B]]> совпадает с <![CDATA[AB]]>. Следовательно, вы можете иметь <![CDATA[]]]]><![CDATA[>]]>, закрывающий тег ]]>, разделенный на две секции CDATA.

1 голос
/ 22 апреля 2009

Попробуйте использовать XInclude вместо попытки встроить XML-документ в другой. Атрибут XInclude parse = "text" заставит XML обрабатываться как текст, а не как разметка.

0 голосов
/ 22 апреля 2009

Разве не для этого символьные объекты ?

...