2015-07-09 2 views
0

Я использую такую ​​технику, чтобы читать в каталоге Xml-файлов объект XmlDocument.Изменение форматирования xml после удаления нежелательных атрибутов.

private static void StripAttributes(string filePath) 
    { 
     Contract.Requires(filePath != null); 
     var xmlDocument = new XmlDocument(); 
     var encode = Encoding.GetEncoding("ISO-8859-1"); 
     using (var sr = new StreamReader(filePath, encode)) 
     { 
      xmlDocument.Load(sr); 
     } 

Это работает, но при визуализации выведенного Xml в текстовом редакторе, одинарные кавычки вокруг атрибутов теперь дважды, и дочерние узлы на другой линии.

Пример от до:

<xml> 
    <xml2> 
    <xmlField id='foo' string='bar'><xmlValue>foobar</xmlValue></xmlField> 
    </xml2> 
</xml> 

примера после форматирования:

<xml> 
    <xml2> 
    <xmlField id="foo"> 
     <xmlValue>foobar</xmlValue> 
    </xmlField> 
    </xml2> 
</xml> 

мне нужен исходный формат, чтобы остаться то же самое для целей сравнения.

Любые идеи о том, как я могу сохранить исходный формат Xml?

ответ

0

Пробелы

Ваш первый вопрос пробельные. В XML это обычно неважно, поэтому по умолчанию XmlDocument нормализует любые существенные пробелы, которые вы видите здесь.

Чтобы изменить это поведение, установите PreserveWhitespace = true перед загрузкой вашего XML:

var xmlDocument = new XmlDocument 
{ 
    PreserveWhitespace = true 
}; 

Котировки

Ваш второй вопрос связан с кавычками. Один или два действительны, но значение по умолчанию в .NET двойное. Оба DOM перезапишут ваш XML, используя внутренний код XmlWriter, который использует это значение по умолчанию. Вы можете, конечно, указать свой собственный экземпляр XmlWriter.

Руководство должно использовать методы фабрики XmlWriter.Create и указать любые функции с помощью XmlWriterSettings, однако в этом случае это не сработает. Вам придется явно создать экземпляр XmlTextWriter и изменить QuoteChar:

var writer = new XmlTextWriter(fileName, encoding) 
{ 
    QuoteChar = '\'' 
}; 

using (writer) 
{ 
    xmlDocument.WriteTo(writer); 
} 

LINQ к XML

Как и в сторону, я настоятельно рекомендую смотреть на LINQ к XML вместо старого XmlDocument API. Чтобы получить подобное поведение в XDocument, вы бы разобрать и написать так:

var doc = XDocument.Load(filePath, LoadOptions.PreserveWhitespace); 
doc.WriteTo(writer); 

Если, как ваш код предполагает, вы удаляете атрибуты, то код так просто, как это было бы удалить все атрибуты с именем string из элементов с именем xmlField:

doc.Descendants("xmlField") 
    .SelectMany(e => e.Attributes("string")) 
    .Remove(); 
+0

Спасибо, что отвечает на мой вопрос. Будет ли XmlWriter работать с StreamReader, или мне нужно заменить StreamReader? –

+0

'StreamReader' используется для * чтения *,' XmlWriter' используется для * записи *. Вы не показали, как вы пишете полученный XML, но это то, что вам нужно использовать, чтобы сделать это, если вы хотите сохранить кавычки как одиночные. –

+0

Будет ли «xmlDocument.Save (filePath)»; или мне нужно будет изменить способ сохранения/записи Xml? –

0

Возможно, вы не можете! С реализацией xml-рендеринга Microsoft.Net рендеринг всегда переформатирует вывод. Любой XmlDocument или XDocument с любыми настройками. В одном из наших моих проектов (Efatura in Turkey) xml-файлы подписываются xades и не должны меняться. Мы поняли, что только рендеринг и сохранение без каких-либо изменений изменяет что-то в XML-файле и делает подпись недопустимой.Также, если, например, входной XML-адрес - это только одна строка (без пробелов). Парсеры (все) не могут проанализировать документ. Эффект, который мы наблюдали, - это синтаксический анализатор, который пропускает некоторые элементы, действующие так, как будто их нет.

Для вашей ситуации я предлагаю попробовать использовать другие реализации xml. В нашем случае, поскольку нам не нужно менять sth, мы сначала сохраняем всю строку отдельно, а затем анализируем копию документа для извлечения из него информации. Когда закончите бросить его на мусор.

Для однострочного xml мы использовали XmlReader, но изменили соответствующий механизм.

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