2016-07-04 79 views
0

我有一個我想讀取的xml文件。前視根標籤I'm做一個XSL變換和讀取修改的文件:根據根標記轉換xml文件

XmlReader reader = XmlReader.Create(myFile); 

var root = new XmlDocument(); 
root.Load(reader); 
if (root.DocumentElement.Name == "FC_FeatureCatalogue") 
{ 
    var xsltDoc = new XmlDocument(); 
    xsltDoc.Load("myXslt.xsl")); 

    XsltSettings xsltSettings = new XsltSettings(false, true); 
    var transformer = new XslCompiledTransform(); 
    transformer.Load(xsltDoc, xsltSettings, new XmlUrlResolver()); 

    using (var stream = new FileStream(newFileName, FileMode.Create)) 
    { 
     transformer.Transform(reader, new XsltArgumentList(), stream); 
    } 
} 

當條件經過newFileName確定的文件被創建。但它只包含一個空條目。所以我調試了一下,注意到當調用root.Load(reader)時,文件被讀取直到EOF。這就是爲什麼當我使用相同的文件進行轉換時,變壓器根本就沒有做什麼,因爲讀者沒有更多的內容。所以有沒有辦法重新設置閱讀器(我知道,XmlReader是「只向前」)或者替代地獲取原始xml文件的根標籤而不讀取EOF並將其轉換?

編輯:爲了驗證我的假設,我也加了我using - 塊中的這些行:

using (var stream = new FileStream(newFileName, FileMode.Create)) 
{ 
    reader.Close(); 
    reader = XmlReader.Create(myFile); 
    transformer.Transform(reader, new XsltArgumentList(), stream); 
} 

現在所創建的文件包含了所有的預期數據。不過,我希望有一種方法可以讀取根標記並轉換文件,而不必重新整理文件。

+1

試試這個:XmlReader reader = XmlReader.Create(myFile); reader.MoveToContent(); if(reader.Name ==「FC_FeatureCatalogue」){} – jdweng

+0

@jdweng Yeap,那就是訣竅。 – HimBromBeere

回答

0

我發現的靈感here的方法。其實我不需要閱讀整個文檔(如XmlDocument.Load一樣)只能獲取根元素。所以,我只是讀取讀者第一行:

while (reader.Read()) 
{ 
    if (reader.NodeType == XmlNodeType.Element) break; 
} 
if (reader.Name == "FC_FeatureCatalogue") 
{ 
    // ... 
} 

Alternativly你也可以使用這個由jdweng這是一個有點短的建議:

reader.MoveToContent(); 
if (reader.NodeType == XmlNodeType.Element) { ... } 

Supprisingly我只是,雖然讀者的內部位置現在可以在文檔中的某個地方適當地轉換xml。我想這是因爲之前讀取的元素只是xml-chunk,就像xml聲明或任何註釋。

1

我看不到的方式來一個的XmlReader內流復位。

一種方法是更直接地使用流,如下所述。

using (FileStream fs = File.Create(myFile)) 
    { 
    var root = new XmlDocument(); 

    root.Load(fs); 

    if (root.DocumentElement.Name == "FC_FeatureCatalogue") 
    { 
     var xsltDoc = new XmlDocument(); 
     xsltDoc.Load("myXslt.xsl")); 

     XsltSettings xsltSettings = new XsltSettings(false, true); 
     var transformer = new XslCompiledTransform(); 
     transformer.Load(xsltDoc, xsltSettings, new XmlUrlResolver()); 

     fs.Seek(0, SeekOrigin.Begin); 

     using (StreamReader sr = new StreamReader(fs)) 
     { 
     XmlReader reader = XmlReader.Create(sr); 
     using (var stream = new FileStream(newFileName, FileMode.Create)) 
     { 
      transformer.Transform(reader, new XsltArgumentList(), stream); 
     }    
     } 
    } 
    }