2009-06-11 48 views
0

是否可以使用XPathNodeIterator選擇節點並獲取外部或InnerXML而不縮進?使用XPathNodeIterator選擇節點而不縮進xml

由於結果在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)沒有identation和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

我用這只是爲了得到注意。 ^^ – 2009-06-11 09:30:37

回答

2

反射表明有沒有快速在這裏改變設置。這是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

+0

感謝它的工作。我創建了一個小型幫助函數,該函數根據XPathNavigator.get_OuterXml源輸出「普通」XML。 – barry 2009-06-12 05:34:34