【问题标题】:LINQ to XML Newbie QuestionLINQ to XML 新手问题
【发布时间】:2009-12-21 23:18:18
【问题描述】:

我加载了一个具有以下结构的 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;

但它总是返回一个空集。

我错过了什么?

【问题讨论】:

    标签: c# .net xml linq linq-to-xml


    【解决方案1】:

    您需要使用 Descendants 或 Elements 指定要获取的节点的命名空间。

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

    【讨论】:

    • 这让我在第一次使用 Linq to XML 时就被吸引了。
    【解决方案2】:

    Root 元素是&lt;worksheet/&gt; 元素,因此向根询问工作表后代将始终返回一个空集。删除.Descendants("worksheet") 子句,您应该会开始看到一些结果。

    【讨论】:

    • xmlDoc.Root.Elements("sheetData").Elements("row) 呢?
    • 我之前尝试过,但对我也不起作用。我不知道这是否与它有关,但 sn-p 来自转换为 XML 的 Microsoft Excel 电子表格。
    【解决方案3】:
    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 元素中获取所有“行”元素。

    【讨论】:

      【解决方案4】:

      这是我在Linqpad 中编写的一些代码,用于在 t = s 的 c 上进行过滤。

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

      希望这会有所帮助!

      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();
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多