2016-04-08 9 views
1

は試行されており、実際の結果は得られません。位置(LinqまたはXPATH)でXMLノードを選択する方法

<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:html="http://www.w3.org/TR/REC-html40"> 
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> 
... 
</DocumentProperties> 
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"> 
... 
</OfficeDocumentSettings> 
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> 
... 
</ExcelWorkbook> 
<Styles> 
... 
</Styles> 
<Worksheet ss:Name="Report"> 
    <Table ss:ExpandedColumnCount="41" ss:ExpandedRowCount="4082" x:FullColumns="1" 
    x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15"> 
    <Row> 
    <Cell ss:StyleID="s62"><Data ss:Type="String">Cell_1</Data></Cell> 
    <Cell ss:StyleID="s62"><Data ss:Type="String">Cell_2</Data></Cell> 
    ... 
    <Cell ss:StyleID="s62"><Data ss:Type="String">Cell_40_Active</Data></Cell> 
    </Row> 
    <Row> 
    <Cell ss:StyleID="s62"><Data ss:Type="String">Cell_1</Data></Cell> 
    <Cell ss:StyleID="s62"><Data ss:Type="String">Cell_2</Data></Cell> 
    ... 
    <Cell ss:StyleID="s62"><Data ss:Type="String">Cell_40_Active</Data></Cell> 
    </Row> 
    </Table> 
    <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> 
... 
    </WorksheetOptions> 
</Worksheet> 
</Workbook> 

目標は、唯一これらの行を選択することで、行の40-セル(ID)内の「Cell_40_Active」が含ま:考える

は、この構造のように、ExcelのXMLです。以下のように:...

 XmlDocument doc = new XmlDocument(); 
     doc.Load(file); 
     XmlElement root = doc.DocumentElement; 
     // does return all Row-elements >> working 
     XmlNodeList nodes = root.GetElementsByTagName("Row"); 
     //does not return any element (0) 
     XmlNodeList nodes = root.SelectNodes("/Worksheet/Row/Cell[40]='Cell_40_Active'"); 

はどのようにこれは、細胞[40] .Data.InnerText = "Cell_40_Active" 行うことができますか?似たようなものを見つけられなかった... 何かヒント?どうもありがとうございました。

答えて

1

すべての要素は、あなたがそれのために準備する必要があり、名前空間urn:schemas-microsoft-com:office:spreadsheetにあります

var nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("x", "urn:schemas-microsoft-com:office:spreadsheet"); 
XmlNodeList nodes = root.SelectNodes("<xpath expr using x prefix>", nsmgr); 

そして、あなたの説明を与えられたXPath式は、おそらく(以前に定義された接頭辞xを使用して)次のようになります。

/x:Workbook/x:Worksheet/x:Table/x:Row[x:Cell[40]/x:Data='Cell_40_Active'] 
+0

それはトリックでした...ありがとう、おい! – SiL3NC3

0

おそらく、XmlNodeListのインデックス関数を利用することができます。たとえば、Linqクエリのコンテキストでは、次のようになります。

var result = from row in root.GetElementsByTagName("Row") 
      where row.index(40).InnerText == "Cell_40_Active" 
      //uses inner text to "skip over" the data tag. 
      //this won't work if you have other child nodes with inner text. 
      select row; 
+0

いるXmlNodeList(メソッドの定義がありません)... エラーでLINQを使用することはできません。重大度\tコード\t説明\tプロジェクト\tファイル\tライン\t抑制状態 エラー\t CS1934は\tソースタイプのクエリパターンの実装を見つけることができませんでした'XmlNodeList'。 「どこに」が見つかりません。範囲変数 'row'の型を明示的に指定することを検討してください。 – SiL3NC3

+0

リスト、先進的なforループ、およびifステートメントを使って、もう少しマニュアルに切り替える必要があると思います。私はXmlNodeListがLINQ用に設定されていなかったことに気付かなかった。 – sowrd299

関連する問題