【问题标题】:Linq to XML Querying Data in C#Linq to XML 在 C# 中查询数据
【发布时间】:2015-01-06 06:41:21
【问题描述】:

XML

<?xml version="1.0" encoding="utf-8" ?>
<Employees>
  <Employee>
    <EmpId>1</EmpId>
    <Name>Sam</Name>
    <Sex>Male</Sex>
    <Salary>40000</Salary>
    <Phone Type="Home">423-555-0124</Phone>
    <Phone Type="Work">424-555-0545</Phone>
    <Address>
      <Street>7A Cox Street</Street>
      <City>Acampo</City>
      <State>CA</State>
      <Zip>95220</Zip>
      <Country>USA</Country>
    </Address>
  </Employee>
  <Employee>
    <EmpId>2</EmpId>
    <Name>Lucy</Name>
    <Sex>Female</Sex>
    <Salary>20000</Salary>
    <Phone Type="Home">143-555-0763</Phone>
    <Phone Type="Work">434-555-0567</Phone>
    <Address>
      <Street>Jess Bay</Street>
      <City>Alta</City>
      <State>CA</State>
      <Zip>95701</Zip>
      <Country>USA</Country>
    </Address>
  </Employee>

LINQ 表达式 c#

var Pro = from u in doc.Descendants("Employee") select u;
        foreach (var x in Pro)
        {
            Response.Write(string.Format("EMP ID: {0}, Emp Name: {1}", x.Element("EmpId"), x.Element("Name")));
        }

我可以查询 EmpID、Name、Salary 等字段。

但是如何查询街道、城市、州、邮编、国家等地址字段?

提前致谢。

【问题讨论】:

  • 要查询所有地址,具体地址吗?请根据您的需要更加明确。
  • 我建议你反序列化到你的对象。这样会更好,更容易。
  • 如何反序列化 XML 中的对象?对不起,我很笨。

标签: c# linq-to-xml


【解决方案1】:

使用

x.Descendants("Address").First().Element("Street") 

【讨论】:

  • 非常感谢。为什么我们必须使用 First()?
  • 因为每个员工可以有多个地址。 First() 取第一个
  • 感谢您的解释。
【解决方案2】:

我也会按照 Reniuz 的建议执行并反序列化为一个对象,但这里是您当前如何执行此操作的示例:

foreach (var x in Pro)
        {
            Response.Write("EMP ID: {0}, Emp Name: {1}\r\n", x.Element("EmpId"), x.Element("Name"));
            var adrs = x.Descendants("Address");
            foreach (var a in adrs)
            {
                Response.Write("\tAddress Street: {0}, City: {1}\r\n", a.Element("Street"), a.Element("City"));    
            }
        }

【讨论】:

  • 谢谢。不错的方法。
【解决方案3】:

将XML带入变量并使用Like

XDocument doc = XDocument.Parse(XMLVariableString);    

var FirstPart = from node in doc.Descendants("items") select node; //Select Data from doc using 

List<ListName> valuesNodes = new List<ListName>(); //create any with i.e <==

创建一个与XML 同名的List 并为Address 创建一个Sub List,包含Address 的所有字段

使用您使用过的相同查询,但从FirstPart 中选择。

现在您可以轻松处理来自var FirstPart 的数据

【讨论】:

    【解决方案4】:

    可以通过首先使用x.Elements("Address") 选择所有地址元素来访问您尝试查找的地址元素。然后可以使用.Element() 函数选择每个嵌套的地址元素。

    所以Response.Write() 的参数应该类似于:

    x.Elements("Address").Element("Street");
    

    【讨论】:

    • Element() 方法无法识别。它仅在以下情况下被识别:x.Descendants("Address").First().Element("Street")。为什么?
    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多