向 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();
您可以将 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++ 托管扩展应该没有问题。希望这有帮助。
我想通了。 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();
在构建 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();
您可以将 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++ 托管扩展应该没有问题。希望这有帮助。
我想通了。 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();