c#中对XML的LINQ查询

本文关键字:LINQ 查询 XML 中对 | 更新日期: 2023-09-27 18:17:09

我需要在c#中从xml中挑选数据。xml的结构如下:

<?xml version="1.0"?>
<xdoc version=""...>
    <something>
        ...
    </something>
    <fields>
        <field dimensions="" name="something else">
            <ff>x</ff>
            <text>something</text>
            <gg>x</gg>
        </field>
        <field dimensions="" name="SUPPLIER_NAME">
            <ff>x</ff>
            <text>This is what I want</text>
            <gg>x</gg>
        </field>
        <field dimensions="" name="something else2">
            <ff>x</ff>
            <text>something2</text>
            <gg>x</gg>
        </field>
    </fields>
    <something2>
        ...
    </something2>
</xdc>

查询代码如下:

XElement root = XElement.Load(path);
IEnumerable<XElement> hodnota = from el in root.Elements("fields")
                              where (string)el.Attribute("name") == "SUPPLIER_NAME" 
                              select el;

foreach (XElement in hodnota)
   textBox1.Text += (string)el.Atribute("text") + Environment.NewLine;

目标是从属性名称为"SUPPLIER_NAME"的元素中选择文本"这是我想要的"。然后把它发送到excel,这部分工作完美无缺,但我找不到正确的表达,所以我写到文本框更快的测试。我试着从xml中挑选字符串,但是没有成功,所以我用这种方式搜索。

有人可以看看提供的代码,告诉我我做错了什么?

谢谢你,安德鲁。

c#中对XML的LINQ查询

给定正确的XML结构,就会得到我想要的结果。

string content = File.ReadAllText(@"C:'YourFolder'Yourfile.xml");
XDocument xDoc = XDocument.Parse(content);
var supplierNameField = xDoc.Descendants("field").First(d => d.Attribute("name").Value == "SUPPLIER_NAME");
var text = supplierNameField.Element("text").Value;

您的问题是属性在字段而不是字段下。下面是一个应该可以工作的示例

    IEnumerable<XElement> hodnota = from el in root.Elements("fields").Elements("field")
                                    where (string)el.Attribute("name") == "SUPPLIER_NAME"
                                    select el;

    foreach (XElement el in hodnota)
        Console.WriteLine(el.Element("text").Value);

还是

    IEnumerable<string> hodnota = from el in root.Elements("fields").Elements("field")
                                    where (string)el.Attribute("name") == "SUPPLIER_NAME"
                                    select el.Element("text").Value;

    foreach (string el in hodnota)
        Console.WriteLine(el);

使用子类

            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> hodnota = doc.Descendants("field").Where(el => el.Attribute("name").Value == "SUPPLIER_NAME").ToList();​