2010-03-03 3 views
9

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

Идея, которая сразу пришла в голову, - это закодировать встроенный xml в base64 или закрепить его. Звучит это нормально?

Я кодирую в C#, кстати.

+2

Речь идет не о встроенном программном обеспечении и на самом деле не следует помечать как таковой. –

ответ

3

Просто кратким примечанием, я отправился по базовому маршруту, и он работает нормально, но при этом он имеет жесткое ограничение производительности, особенно при интенсивном использовании. Мы делаем это с фрагментами документов до 20 МБ, а после кодировки base64 они могут принимать до 65 МБ (с тегами и данными) даже при застегивании.

Однако большая проблема заключается в том, что кодирование .NET base64 может потреблять до 10 раз в памяти при выполнении кодирования/декодирования и часто может вызывать исключения OOM, если они выполняются повторно и/или выполняются на нескольких потоках.

Кто-то, по аналогичному вопросу рекомендовал ProtoBuf в качестве опции, а также Fast InfoSet как еще один вариант.

+0

Поскольку данные, которые я хочу внедрить, являются XML, его сильно сжимаемые, после некоторых тестов кажется, что если я сначала скомпилирую xml перед преобразованием в base64, результирующий размер в байтах примерно на 10% меньше, чем объем данных, исходный сжатый xml. Думаю, я поеду по этому пути! – tempy

+0

Я думаю, что вы можете попробовать использовать порт C# vtd-xml, многие проблемы с DOM решаются красиво, например, производительность (кажется, вы беспокоитесь о разборе) и использование памяти, но это внешний набор инструментов (не часть дистрибутива .NET) http://vtd-xml.sf.net –

+0

Спасибо за ссылку @Jimmy zhang – GrayWizardx

1

Я бы кодировал его по-своему (например, base64 или HttpServerUtility :: UrlEncode, ...), а затем вставлял его.

5

Вы можете преобразовать XML в массив байтов, а затем преобразовать его в формат binary64. Это позволит вам вложить его в элемент и не использовать CDATA.

4

Утвержденный W3C способ сделать это XInclude. Существует реализация для .Net по адресу: http://mvp-xml.sourceforge.net/xinclude/

+2

The.NET Framework не имеет реализации XInclude. –

+1

Ссылка, которую я отправил, - это реализация XInclude для .Net в C#. –

3

В зависимости от того, как вы строите XML, один из способов - не заботиться об этом и позволить фреймворку обрабатывать его.

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?><helloworld></helloworld>"); 
string xml = "<how><are><you reply=\"i am fine\">really</you></are></how>"; 
doc.GetElementsByTagName("helloworld")[0].InnerText = xml; 

Выход будет что-то вроде HTMLEncoded строки:

<?xml version="1.0" encoding="utf-8"?> 
<helloworld>&lt;how&gt;&lt;are&gt;&lt;you 
    reply="i am fine"&gt;really&lt;/you&gt;&lt;/are&gt;&lt;/how&gt; 
</helloworld> 
1

Если вам не нужен XML-декларации (первая строка документа), просто вставьте корневой элемент (со всем Чайлдсом) в дерево другого документа xml как дочерний элемент существующего элемента. Используйте другое пространство имен для разделения вставленных элементов.

+0

Это все равно приведет к тому, что анализатор на принимающей стороне проанализирует встроенный xml, который я бы хотел избежать , – tempy

+1

@tempy, синтаксический анализатор должен также анализировать данные с кодировкой CDATA или базы 64, чтобы проверить, что он хорошо сформирован и передать его в приложение в качестве символьных данных. Вам нужно будет сравнить его, чтобы увидеть, стоит ли выкидывать структуру больше или меньше, чем анализировать лишние байты в base64. –

+0

@Pete Kirkham. Это хороший момент ... Мне придется исследовать. – tempy

-1

Я использую Комментарии для этого:

< - ваш XML-текст - >

[Изменено]
Если встроенный XML с комментариями, заменить его на другой синтаксис!.

 
<?xml version="1.0" encoding="iso-8859-1" ?> 
<xml> 
    <status code="0" msg="" cause="" /> 
    <data> 
     <order type="07" user="none" attrib="..." > 
     <xmlembeded > 
      <!-- 
       <?xml version="1.0" encoding="iso-8859-1" ?> 
       <xml> 
       <status ret="000 "/> 
       <data> 
       <allxml_here /> 
       <!** embedeb comments **> 
       </data> 
       <xml> 
      --> 
     </xmlembeded > 
     </order> 
     <context sessionid="12345678" scriptname="/from/..." attrib="..." /> 
    </data> 
</xml> 
+1

Что делать, если комментарий в встроенном xml тоже? Разве это не раскомментирует остальное? –

+0

Это не мое дело, я знаю, что я вхожу. – lsalamon

+0

Это немного пахнет для меня. Рассмотрение внутреннего XML-комментария, которое потребовало бы рассматривать его как одну потенциально гигантскую строку, могло бы быть довольно дорогостоящим, и я думаю, этого можно избежать, используя другие методы. – tempy

0

Вы не можете использовать XSLT для этого? Возможно, используя xsl: copy или xsl: copy-of? Для этого и предназначен XSLT.

Смежные вопросы