2011-01-27 2 views
1

Я создаю XML-файл с использованием LinqXML.LINQ to XML XElement Node

string value = "Steet,<BR> </BR> City"; 
XElement address = new XElement("Address", value); 

После того, как я пишу файл XML, значение адреса отображается как Steet,&lt;BR&gt &lt;/BR&gt мне просто нужно, как это походит на оригинал. (Даже если это не хорошо сформировать)

ответ

4

Ну, если этот материал не очень хорошо образован, то не следует ожидать, чтобы иметь возможность рассматривать его как XML. Таким образом, если вы хотите поместить неправильно сформированную разметку HTML в элемент XML, тогда рассмотрите использование раздела CDATA, например.

string value = "Steet,<BR> </BR> City"; 
    XElement address = new XElement("Address", new XCData(value)); 

, что приведет к

<Address><![CDATA[Steet,<BR> </BR> City]]></Address> 

Если вы хотите, чтобы разобрать значение как XML, то сделать это с XmlReader в режиме фрагмента, например,

static void Main() 
{ 
    string value = "Steet,<BR> </BR> City"; 
    XElement address = new XElement("Address", ParseFragment(value)); 
    Console.WriteLine(address); 
} 

static IEnumerable<XNode> ParseFragment(string fragment) 
{ 
    using (StringReader sr = new StringReader(fragment)) 
    { 
     using (XmlReader xr = XmlReader.Create(sr, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment })) 
     { 
      xr.Read(); 
      XNode node; 
      while (!xr.EOF && (node = XNode.ReadFrom(xr)) != null) 
      { 
       yield return node; 
      } 
     } 
    } 
} 

Это приводит к

<Address>Steet,<BR> </BR> City</Address> 
+0

Спасибо Мартину. Поскольку я являюсь новым голосованием, я могу увеличить только на 1. Еще раз спасибо за пример. – dps123

+0

Это фактически функционально идентично оригинальной версии. Не имеет значения, если вы избежите '<' с '<' или с CDATA. В любом случае, когда вы читаете значение узла «

» с синтаксическим анализатором XML, вы получите строку с буквальными скобками в ней. –

+0

Привет, Джоэл, Спасибо за ответ. Этот XML будет использоваться для создания PDF-файлов. Поэтому ребята, создающие PDF, ожидают теги, чтобы их можно было сопоставить с этим инструментом. Например, (
=> PDF Break) – dps123

0

вам нужно обернуть его в CDATA, чтобы сохранить его

+0

Thanks lvanonv. – dps123

1

Я не думаю, что вам нужно изменить что-либо. &lt; и &gt; - как угловые скобки экранированы в XML. Анализаторы XML автоматически возвращают их в буквальные угловые скобки при чтении строковых значений. CDATA - это просто еще один способ избежать угловых скобок. В этом случае оба выполняют точно то же самое. Если вы берете исходный код и читаете значение узла <Address> с помощью синтаксического анализатора XML, возвращаемая строка будет Street,<BR> </BR> City. Изменение метода экранирования на CDATA фактически ничего не меняет, кроме как сделать ваш XML (возможно) более трудным для чтения.

Если вы хотите, чтобы тег <BR /> был фактически частью XML-документа, вы должны сделать его частью документа. То есть ...

new XElement("Address", "Street,", new XElement("BR"), " City") 
Смежные вопросы