2015-03-13 2 views
0

Что такое правильный способ добавления разрывов строк и отступов при построении XmlDocument сделать свой вывод (названный xmlDocoment-> DocumentElement-> OuterXml) выглядит следующим образом:Добавление разрывы строк и абзацы в XmlDocument

<QualifyingProperties Target="#SignatureElem_0" xmlns="http://uri.etsi.org/01903/v1.3.2#"> 
    <SignedProperties Id="SignedPropertiesElem_0"> 

Это так, как я строю мой XmlDocument:

XmlDocument^ xmlDoc = gcnew XmlDocument(); 
xmlDoc->PreserveWhitespace = true; 

XmlNode^ nQualifyingProperties = xmlDoc->CreateNode(XmlNodeType::Element, "QualifyingProperties", "http://uri.etsi.org/01903/v1.3.2#"); 
xmlDoc->AppendChild(nQualifyingProperties); 
XmlNode^ nodAttribute = xmlDoc->CreateNode(XmlNodeType::Attribute, "Target", ""); 
nodAttribute->Value = SignatureId; 
nQualifyingProperties->Attributes->SetNamedItem(nodAttribute) 

XmlNode^ nSignedProperties = xmlDoc->CreateNode(XmlNodeType::Element, "SignedProperties", "http://uri.etsi.org/01903/v1.3.2#"); 
nQualifyingProperties->AppendChild(nSignedProperties); 
nodAttribute = xmlDoc->CreateNode(XmlNodeType::Attribute, "Id", ""); 
nodAttribute->Value = SignedPropertiesId; 
nSignedProperties->Attributes->SetNamedItem(nodAttribute); 

я обнаружил, что это работает для линии изломов:

XmlNode^ linebreak = xmlDoc->CreateTextNode("\n"); 
nQualifyingProperties->AppendChild(linebreak); 

Но я не уверен, что это правильный путь. Это? А как насчет отступов (вкладок)?

EDIT: Я добавляю это XmlDocument в SignedXml в DataObject (где он будет подписан), поэтому я не могу контролировать форматирование этого конкретного элемента, и, хотя это не имеет большого значения, было бы приятно заставить его работать так, как я хочу, чтобы он работал.

ответ

0

Я понял. XmlDocument должны быть записаны в поток с XmlWriter с использованием, как Павел предложил, XmlWriterSettings с поддержкой Отступ собственности. Пример:

XmlDocument^ xmlDocument = gcnew XmlDocument(); 
xmlDocument->PreserveWhitespace = true; 

//add some elements 

XmlWriterSettings settings = new XmlWriterSettings(); 
XmlWriterSettings.Indent = true; 
XmlWriterSettings.IndentChars = "\t"; //tabs instead of spaces 

Stream^ stream = gcnew MemoryStream(); //or FileStream to write an Xml file directly to disk 

XmlWriter^ writer = XmlWriter::Create(stream, settings); 
xmlDocument->WriteTo(writer); 
writer->Close(); 
0

Вы не можете сделать это с помощью свойства OuterXml, и было бы неплохо попытаться вставить символы форматирования в сам документ, но есть несколько других способов.

Самый прямой способ получить то, что вы хотите с помощью API XmlDocument, - использовать метод XmlDocument.Save() - вы можете попробовать XmlDocument-> Сохранить (Stream), чтобы сохранить его в MemoryStream, а затем прочитать поток. Это даст вам довольно печатную версию.

Было бы проще, если бы вы могли использовать XDocument, но, по-видимому, это не поддерживается на C++. Если у вас есть возможность включать некоторые управляемый код в проекте, это будет выглядеть следующим образом:

XDocument xd = XDocument.Parse(xmlDoc.OuterXml); 
return xd.ToString(); 
+0

Спасибо за предложение. XmlDocument.Save() выполняет задание, но из того, что я помню, он использует пробелы для отступов вместо обычных вкладок. –

0

Вы можете использовать XmlWriter с StringBuilder бэк-магазином и XmlWriterSettings с Indent собственности включено. Например.

var document = new XmlDocument(); 
// generate document here 

var buffer = new StringBuilder(); 
var writer = XmlWriter.Create(buffer, new XmlWriterSettings { Indent = true }); 
document.Save(writer); 
writer.Close(); 

Console.WriteLine(buffer); 

Не должно быть проблем с преобразованием его из C# в управляемые расширения C++. Надеюсь это поможет.

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