向 XmlDocument 添加换行符和缩进

Adding line breaks and indents to XmlDocument

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

<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(将在其中签名),因此我无法控制此特定元素的格式,虽然这没什么大不了的,但让它按我想要的方式工作会很好它可以工作。

您无法使用 OuterXml 属性 做到这一点,尝试将格式字符插入文档本身是个坏主意,但还有其他一些方法。

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

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

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

您可以将 XmlWriterStringBuilder 后备存储一起使用,将 XmlWriterSettingsIndent 属性 一起使用。例如。

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++ 托管扩展应该没有问题。希望这有帮助。

我想通了。 XmlDocument 应使用 XmlWriter 写入 Stream,如 Pavel 建议的那样, XmlWriterSettings 启用 Indent 属性。像这样:

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