使用XPathNodeIterator选择一个节点而不缩进xml

时间:2009-06-11 09:28:51

标签: .net xpath

是否可以使用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>

1 个答案:

答案 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