2010-09-06 18 views
0

Я сериализации строку XML с помощью следующего кодаПустая строка сериализации

StringReader newStringReader = new StringReader(value.Value); 
      try 
      { 
       using (var reader = XmlReader.Create(newStringReader)) 
       { 
        newStringReader = null; 
        writer.WriteNode(reader, false); 
       } 
      } 
      finally 
      { 
       if (newStringReader != null) 
        newStringReader.Dispose(); 
      } 

но в письменном файле XML я имею

<property i:type="string"> 
    <name>Test</name> 
    <value> 
    </value> 
</property> 

, но правильно было бы

<property i:type="string"> 
    <name>Test</name> 
    <value></value> 
</property> 

так как свойство value является пустой строкой. Как он сериализуется, он не возвращает «\ r \ n».

Автор:

XmlTextWriter writer = new XmlTextWriter(output); 
try { writer.Formatting = System.Xml.Formatting.Indented; 
writer.Indentation = 2; // Konfiguration sichern 
WriteConfiguration(config, writer); 
} 
finally { writer.Close(); } 

Что я сделал не так?

UPDATE: Я пишу конфигурационный файл xml. Значения могут быть как ints, bools, так и т. Д. Или другие строки xml. Эти строки xml написаны с помощью приведенного выше кода. Он отлично работает, за исключением элементов emtpy string в строке xml.

UPDATE 2: Это работает, если я вручную изменил строку xml, которую я хочу написать. Я заменить все

<tag></tag> 

по

<tag/>

Unfortunatley это на самом деле не "правильное" решение, чтобы изменить строку с регулярными выражениями.

+0

Да, для меня проблема скорее всего в 'value.Value'. Какая ценность? – digEmAll

+0

да, строка в value.Value всегда xml. Он исходит из XML-сериализатора. Эта строка не содержит строк. –

ответ

1

Мне всегда было намного удачнее форматировать документы XML, когда я работаю с ними как типы XDocument, и просто используйте метод Save. Например xmlDoc.Save ("C: \ temp \ xmlDoc.xml"); Просто как тот. Кроме того, вы можете сохранять много раз в процессе редактирования с небольшим успехом (по крайней мере, я не заметил).

+0

Это не сработает, поскольку строка, которую я пишу как xml, является только одной записью в большем файле xml. –

+0

вы все еще можете (используя Linq) работать с отдельными элементами из более крупного документа. Если, однако, вас интересует только один элемент, перейдите к классу XElement. В любом случае, если вы собираетесь работать с XML и редактировать его, я думаю, что Linq to XML - это то, что стоит посмотреть на вас. – Adkins

1

Я бы сказал, что это вызвано параметрами отступа. Вы пытались установить значение свойства «Отступ» равным false?

+0

Нет, письменный xml должен быть заключен. –

0

Я пишу xml-файл с настройками. В этом файле также могут быть другие XML-документы. Приведенный выше код гарантирует, что он не написан в одной строке с > и т. Д., Но как xml в xml. Поэтому я должен работать с методом WriteNode.

0

попытка удаления

writer.Formatting = System.Xml.Formatting.Indented; 
writer.Indentation = 2; 

линии, и посмотреть, что происходит.

+0

Нет, xml должен быть отформатирован. –

+2

ОК, но попробуйте? возможно, реализация отступов применяется только для проверки. Если это источник проблемы, тогда у вас есть другой вопрос, чтобы найти ответ. – Numenor

0

Мы не преодолели эту проблему путем использования коротких тегов формы ...

<value /> 

... вместо ...

<value></value> 

... то вы не можете иметь разрывы строк в выходе XML. Для этого вам нужно запросить свое дерево, прежде чем передавать его автору.

/// <summary> 
/// Prepares the XML Tree, to write short format tags, instead 
/// of an opening and a closing tag. This leads to shorter and 
/// particularly to valid XML files. 
/// </summary> 
protected static void Sto_XmlShortTags(XmlNode node) 
{ 
    // if there are children, make a recursive call 
    if (node.ChildNodes.Count > 0) 
    { 
    foreach (XmlNode childNode in node.ChildNodes) 
     Sto_XmlShortTags(childNode); 
    } 
    // if the node has no children, use the short format 
    else 
    { 
    if (node is XmlElement) 
     ((XmlElement)node).IsEmpty = true; 
    } 
} 
Смежные вопросы