是否可以使用XPathNodeIterator选择节点并获取Outer或InnerXML而不缩进?
由于结果用于XHTML输出,缩进(使用空格)将导致布局差异。
示例代码段:
xmlDoc = New XPathDocument(fileIn, xmlSpace.Preserve)
xmlNav = xmlDoc.CreateNavigator()
Dim xmlNode As XPathNodeIterator
xmlNode = xmlNav.Select("/books/chapter[page[@process='True']]")
While xmlNode.MoveNext()
content = xmlNode.Current.selectSingleNode("para").OuterXML)
etc.
在这种情况下,我会得到以下结果(请注意,原始文档(fileIn)没有标识,XML只是一行:
<para process="True">
<a href="#1109062">
<em>Some content</em>
</a>
</para>
我想得到以下内容。
<para process="True"><a href="#1109062"><em>Some content</em></a></para>
答案 0 :(得分:3)
Reflector建议在这里没有快速设置。这是XPathNavigator.get_OuterXml
:
public virtual string get_OuterXml()
{
if (this.NodeType == XPathNodeType.Attribute)
{
return (this.Name + "=\"" + this.Value + "\"");
}
if (this.NodeType == XPathNodeType.Namespace)
{
if (this.LocalName.Length == 0)
{
return ("xmlns=\"" + this.Value + "\"");
}
return ("xmlns:" + this.LocalName + "=\"" + this.Value + "\"");
}
StringWriter output = new StringWriter(CultureInfo.InvariantCulture);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Auto;
XmlWriter writer2 = XmlWriter.Create(output, settings);
try
{
writer2.WriteNode(this, true);
}
finally
{
writer2.Close();
}
return output.ToString();
}
请注意settings.Indent = true
。
一个想法是创建一个帮助方法来执行此代码所执行的操作,但使用XmlWriter
的首选设置。然后使用您找到的节点调用此方法,而不是访问其OuterXml
。