2009-04-22 2 views
4

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

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

+0

Чтения вашего комментария к моему ответу, кажется, что мы говорим о двух разных вещах. Я говорил об инкапсулировании XML-текста в XML-документе: например, размещение примерной программы в проводке. Вы, кажется, говорите о том, чтобы просто обернуть хорошо сформированный XML с более корректным XML. В этом случае текстовое конкатенация может быть вашим лучшим выбором (хотя обе части текста должны создаваться сериализатором). – kdgregory

+0

Обратите внимание, что такая упаковка не будет включать CDATA ... – kdgregory

+0

Хорошо сформированный XML, который мне нужно обернуть, сам по себе является хорошо сформированным XML-документом, который затем должен быть встроен в XML-документ (и впоследствии может быть извлечен). Таким образом, ваш ответ, плюс мое прозрение, аккуратно решил проблему. –

ответ

3

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

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

+0

Дважды я начал комментировать, что, хотя этот ответ был хорош, он не соответствовал тому, что я делал, что упрощало получение текстового потока, который содержал XML-документ, который должен был быть обернут в XML и отправлен обратно. Разбор в DOM не был частью задачи. Но я отменил свои комментарии.Этот ответ просто продолжал взвешивать меня, и у меня наконец появилось прозрение: в то время как время ввода было критическим, выход не был. Итак, разверните поток, чтобы буферизовать XML, проанализировать его, обернуть и сериализовать. Готово! –

2

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

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

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

Обратите внимание, что внутренняя CDATA имеет свое окончание ">" избавилась, как &gt;.

1

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

1

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

4

Вы можете сделать это, просто добавив документ (без его объявления < ?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>