LINQ to XML 新手问题

发布于 2024-08-15 14:28:14 字数 836 浏览 5 评论 0原文

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

但它总是返回一个空集。

我缺少什么?

I have an loaded an XML document with the following structure:

<?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>

I want to query the document for any elements named c that has the attribute t = s.

I have tried many different variations on how to do this:

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

But it always returns an empty set.

What am I missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

英雄似剑 2024-08-22 14:28:14

您需要指定通过后代或元素获得的节点的命名空间。

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

You need to specify the namespace of the node you are getting with Descendants or Elements.

XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
var rows = from row in xmlDoc.Root.Descendants(ns + "sheetData")
       select row;
苍景流年 2024-08-22 14:28:14

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

The Root element is the <worksheet/> element so asking the root for a worksheet descendant will always return an empty set. Remove the .Descendants("worksheet") clause and you should start seeing some results.

薄荷梦 2024-08-22 14:28:14
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;

这会从 root/sheetData 元素中获取所有“row”元素。

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;

This grabs all the "row" elements from within the root/sheetData element.

橘寄 2024-08-22 14:28:14

这是我在 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();

}

Here is some code I wrote in Linqpad that does the filter on c where t = s.

I know the answer has been accepted, but this solution actually does the filtering whereas none of the other answers above do :)

Hope this helps!

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

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文