简体   繁体   English

在 C# 中使用 LINQ 解析 XML

[英]Parsing XML using LINQ in c#

In this xml file (http://www.studiovincent.net/list.xml):在这个 xml 文件 (http://www.studiovincent.net/list.xml) 中:

<list version="1.0">
  <meta>
    <type>resource-list</type>
  </meta>
  <resources start="0" count="4">
    <resource classname="Quote">
      <field name="name">Vincent</field>
      <field name="username">Hill</field>
      <field name="age">31</field>
      <field name="hair">black</field>
    </resource>
    <resource classname="Quote">
      <field name="name">John</field>
      <field name="username">Tedelon</field>
      <field name="age">27</field>
      <field name="hair">brown</field>
    </resource>
    <resource classname="Quote">
      <field name="name">Michael</field>
      <field name="username">Lopez</field>
      <field name="age">20</field>
      <field name="hair">red</field>
    </resource>
    <resource classname="Quote">
      <field name="name">Frank</field>
      <field name="username">Lopez</field>
      <field name="age">25</field>
      <field name="hair">black</field>
    </resource>
  </resources>
</list>

using this code:使用此代码:

using System.Xml;
using.System.Xml.Linq;

XmlReader reader = XmlReader.Create("http://www.studiovincent.net/list.xml");
XElement el = XElement.Load(reader);
reader.Close();

var items = el.Elements("resources").Elements("resource").Descendants().DescendantNodes();

var items = from item in el.Elements("resources").Elements("resource").Descendants() 
            where item.Attribute("name").Value == "name" select item.FirstNode;

foreach (XNode node in items)
{
    Console.WriteLine(node.ToString());
}

I have this OUTPUT:我有这个输出:

Vincent
John
Michael
Frank

Code working very good, but I need get value 31 which corresponds field name="age" where field name="name" is Vincent.代码工作得很好,但我需要获取值31 ,它对应于字段名称 =“年龄”,其中字段名称 =“名称”是文森特。 How Can I get this result?我怎样才能得到这个结果?

I recommend you do as you would when reading XML naturally.我建议您像自然地阅读 XML 那样做。

In your code, try to find all the fields with the name attribute set to "name" .在您的代码中,尝试查找name属性设置为"name"所有字段。

This process cannot be used to associate a name with an age.此过程不能用于将姓名与年龄相关联。 It is more natural to read the XML and check all resource elements.读取 XML 并检查所有resource元素会更自然。 Then add to this element some information described in the field elements.然后向该元素添加field元素中描述的一些信息。

// Using LINQ to SQL
XDocument document = XDocument.Load("http://www.studiovincent.net/list.xml");  // Loads the XML document.
XElement resourcesElement = document.Root.Element("resources");  // Gets the "resources" element that is in the root "list" of the document.

XElement resourceElementVincent = (from resourceElement in resourcesElement.Elements("resource")// Gets all the "resource" elements in the "resources" element
                                    let fieldNameElement = resourceElement.Elements("field").Single(fieldElement => fieldElement.Attribute("name").Value == "name")  // Gets the field that contains the name (there one and only one "name" field in the "resource" element -> use of Single())
                                    where fieldNameElement.Value == "Vincent"  // To get only resources called "Vincent"
                                    select resourceElement).Single();  // We suppose there is one and only 1 resource called "Vincent" -> Use of Single()
XElement fieldAgeElement = resourceElementVincent.Elements("field").Single(fieldElement => fieldElement.Attribute("name").Value == "age");  // Gets the corresponding "age" field
int age = int.Parse(fieldAgeElement.Value, CultureInfo.InvariantCulture);  // Gets the age by Parse it as an integer
Console.WriteLine(age);

Does it do what you want?它做你想要的吗?

Consider this below XML is there as one of the SQL table's column.考虑以下 XML 作为 SQL 表的列之一。

<Root>
  <Name>Dinesh</Name>
  <Id>2</Id>
</Root>

The objective of the query is to fetch the Name from the XML.查询的目标是从 XML 中获取 Name。 In this example we will fetch the 'Dinesh' as the value.在本例中,我们将获取“Dinesh”作为值。

var Query = (from t in dbContext.Employee.AsEnumerable()
where t.active == true 
select new Employee
{
    Id = t.AtpEventId,  
    Name = XDocument.Parse(t.Content).Descendants("Root").Descendants("Name").ToList().  
    Select(node => node.Value.ToString()).FirstOrDefault()  
});

Note the following:请注意以下事项:

  1. t.active == true is just an example to make some condition if needed. t.active == true只是在需要时设置一些条件的示例。

  2. Please note, in the above LINQ query, always use the AsEnumerable, as I did in the first line.请注意,在上面的 LINQ 查询中,始终使用 AsEnumerable,就像我在第一行中所做的那样。

  3. Descendants("Root").Descendants("Name") - here "Root" should be the element matching with the XML, and under Root we have Name element. Descendants("Root").Descendants("Name") - 这里的 "Root" 应该是与 XML 匹配的元素,在 Root 下我们有 Name 元素。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM