2009-12-21 65 views
0

我有一个加载XML文档结构如下:的LINQ to XML新手问题

<?xml version="1.0" encoding="UTF-8" ?> 
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> 
    <sheetData> 
    <row r="1" spans="1:2"> 
     <c r="A1" t="s"> 
     <v>0</v> 
     </c> 
     <c r="B1" t="s"> 
     <v>1</v> 
     </c> 
    </row> 
    </sheetData> 
</worksheet> 

我想查询名为c具有属性t = s的任何元素的文档。

我试图就如何做到这一点许多不同的变化:

XDocument xmlDoc = XDocument.Load(@"..\..\Sheet1.xml"); 
var rows = from row in xmlDoc.Root.Descendants("worksheet").Elements("sheetData") 
     select row; 

但它总是返回一个空集。

我错过了什么?

回答

1

根元素是<worksheet/>元素,以便询问根为工作表后代将始终返回一个空集。删除.Descendants("worksheet")条款,你应该开始看到一些结果。

+0

这没有奏效。我尝试过: xmlDoc.Elements(“row”) – coson

+0

'xmlDoc.Root.Elements(“sheetData”)。Elements(“row”)? –

+0

我以前试过,它对我也不适用。我不知道这有什么关系呢,但片段是从Microsoft Excel电子表格转换为XML。 – coson

3

你需要指定要与后代或元素得到节点的命名空间。

XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; 
var rows = from row in xmlDoc.Root.Descendants(ns + "sheetData") 
     select row; 
+0

这抓住了我了我第一次使用的LINQ to XML。 – Sekhat

0
XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; 
XDocument xmlDoc = XDocument.Load(@"..\..\Sheet1.xml"); 
var rows = from row in xmlDoc.Root.Element(ns + "sheetData").Elements(ns + "row") 
     select row; 

这抓住所有的 “行” 的元件从根/ sheetData元件内。

0

下面是一些代码我在Linqpad,做第C其中t = S滤波器写道。

我知道答案已被接受,但这种解决方案实际上做的过滤,而没有其他的答案上面做:)

希望这有助于中!

void Main() 
{ 
    var xml = @"<?xml version=""1.0"" encoding=""UTF-8"" ?> 
     <worksheet xmlns=""http://schemas.openxmlformats.org/spreadsheetml/2006/main"" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships""> 
      <sheetData> 
       <row r=""1"" spans=""1:2""> 
        <c r=""A1"" t=""s""> 
         <v>0</v> 
        </c> 
        <c r=""A2"" t=""b""> 
         <v>0</v> 
        </c> 
        <c r=""B1"" t=""s""> 
         <v>1</v> 
        </c> 
       </row> 
      </sheetData> 
     </worksheet>"; 

    XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; 

    var d = XDocument.Parse(xml); 
    //d.Dump(); 
    //d.Dump("xdocument dump"); 

    var q = from cell in d.Root.Descendants(ns + "sheetData").Descendants(ns + "row").Descendants(ns + "c") 
      where cell.Attributes("t").FirstOrDefault().Value == "s" 
      select cell; 
    q.ToList().Dump(); 

}