2009-06-11 4 views
0

XPathNodeIteratorを使用してノードを選択し、インデントなしでOuterまたはInnerXMLを取得できますか?xmlをインデントしないでXPathNodeIteratorを持つノードを選択

結果が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を持っていないことに注意して、すべてのちょうど1つの行です:

<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

私はこれを使ってインデントを取得しました。 ^^ –

答えて

2

リフレクターには素早いありません示唆しますここで変更する設定。

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:これはXPathNavigator.get_OuterXmlの源です。

1つのアイデアは、このコードが実行するヘルパーメソッドを作成することですが、XmlWriterの優先設定を使用することです。次に、OuterXmlにアクセスするのではなく、見つけたノードでこのメソッドを呼び出します。

+0

ありがとうございました。私はXPathNavigator.get_OuterXmlソースに基づいて "普通の" XMLを出力する小さなヘルパー関数を作成しました。 – barry

関連する問題