向XmlDocument添加换行符和缩进

时间:2015-03-13 14:04:41

标签: .net line-breaks xmldocument

在构建 XmlDocument 以使其输出(由 xmlDocoment-> DocumentElement-> OuterXml 调用)时,添加换行符和缩进的正确方法是什么像这样:

<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 );

但我不确定这是正确的方法。是吗?那些缩进(制表符)呢?

修改的: 我将这个XmlDocument添加到SignedXml作为DataObject(它将被签名),因此我无法控制这个特定元素的格式,虽然它没什么大不了的,但它会很高兴让它按照我希望的方式工作。

3 个答案:

答案 0 :(得分:0)

您无法使用OuterXml属性执行此操作,尝试将格式化字符插入文档本身是一个坏主意,但还有其他一些方法。

使用XmlDocument API获得所需内容的最直接方法是使用XmlDocument.Save()方法 - 您可以尝试XmlDocument-&gt; Save(Stream)将其保存到MemoryStream然后读取流。这会给你一个漂亮的印刷版本。

如果你可以使用XDocument会更容易,但显然C ++不支持。如果您可以选择在项目中包含一些托管代码,它将如下所示:

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

答案 1 :(得分:0)

您可以将XmlWriterStringBuilder支持商店一起使用,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 ++托管扩展应该没有问题。希望这会有所帮助。

答案 2 :(得分:0)

我已经弄清楚了。 XmlDocument 应该使用 XmlWriter 写入 Stream ,使用像Pavel建议的 XmlWriterSettings 缩进< / em>属性已启用。像这样:

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();