在C#中使用LINQ查询XML

时间:2015-10-09 16:47:22

标签: c# xml linq

我需要在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,但没有成功,所以这样做。

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

谢谢你, 安德鲁

3 个答案:

答案 0 :(得分:1)

鉴于正确的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;

答案 1 :(得分:1)

您的问题是属性位于字段而非字段下。这是一个应该起作用的样本

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

答案 2 :(得分:0)

使用后代

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