LINQ to XML 简单查询

发布于 2024-08-29 04:54:58 字数 800 浏览 1 评论 0原文

我有一个像这样的 XML 文档:

<Persons>
 <Person Id="10000" FullName="Jon Doe">
  <Status StatusID="1" StatusDesc="Active"/>
      <Fields>
          <Field FieldId="1" Value="xxxx"/>
          <Field FieldId="2" Value="yyyy"/>
          <Field FieldId="2" Value="zzzz"/>
      </Fields>
 </Person>
 <Person Id="10001" FullName="John Smith">
  <Status StatusID="2" StatusDesc="New"/>
  <Fields>
      <Field FieldId="3" Value="aaaa"/>
      <Field FieldId="4" Value="bbbb"/>
     <Field FieldId="5" Value="ccccv"/>
  </Fields>
 </Person>
</Persons>

我想编写一个返回“Person”ID 和所有“Fields”元素的 XML 查询。 我可以获取所有“Fields”元素,但不能获取“Person”ID。 当我需要“状态”元素时,这同样适用。

任何帮助将不胜感激。

I have an XML doc like this:

<Persons>
 <Person Id="10000" FullName="Jon Doe">
  <Status StatusID="1" StatusDesc="Active"/>
      <Fields>
          <Field FieldId="1" Value="xxxx"/>
          <Field FieldId="2" Value="yyyy"/>
          <Field FieldId="2" Value="zzzz"/>
      </Fields>
 </Person>
 <Person Id="10001" FullName="John Smith">
  <Status StatusID="2" StatusDesc="New"/>
  <Fields>
      <Field FieldId="3" Value="aaaa"/>
      <Field FieldId="4" Value="bbbb"/>
     <Field FieldId="5" Value="ccccv"/>
  </Fields>
 </Person>
</Persons>

I want to write an XML query that returns the "Person" ID and all "Fields" elements.
I can get all "Fields" elements but not the "Person" ID.
The same applies when I need the "Status" element.

Any help will be appreciated.

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

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

发布评论

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

评论(1

浴红衣 2024-09-05 04:54:58

尝试这样的操作:

var result = XElement.Load("Example.xml")
  .Elements("Person")
  .Select(p => new {
   Id = p.Attribute("Id").Value,
   Fields = p.Descendants("Field").Select(f => new {
      Id = f.Attribute("FieldId").Value,
      Value = f.Attribute("Value").Value
     })
  });

这将为您提供一系列看起来像这样的匿名类型:

class Anonymous
{
    public String Id { get; }
    public IEnumerable<AnonymousSubtype> Fields { get; }
}

class AnonymousSubtype
{
   public String Id { get; }
   public String Value { get; }
}

我使用 Descendants 方法来检索字段的原因是因为我首先使用的元素是Person 元素。由于Elements 仅返回直接子节点,因此无法检索字段,因此我使用了后代

要枚举结果,您可以这样做:

foreach (var person in result)
{
    Console.WriteLine("Person Id: {0}", person.Id);
    foreach (var field in person.Fields)
    {
        Console.Write("  Field Id: {0}", field.Id);
        Console.WriteLine("  Field Value: {0}", field.Value);
    }
}

Try something like this:

var result = XElement.Load("Example.xml")
  .Elements("Person")
  .Select(p => new {
   Id = p.Attribute("Id").Value,
   Fields = p.Descendants("Field").Select(f => new {
      Id = f.Attribute("FieldId").Value,
      Value = f.Attribute("Value").Value
     })
  });

This will give you a sequence of anonymous types that look something like this:

class Anonymous
{
    public String Id { get; }
    public IEnumerable<AnonymousSubtype> Fields { get; }
}

class AnonymousSubtype
{
   public String Id { get; }
   public String Value { get; }
}

The reason that I used the Descendants method to retrieve the fields is because the element I am first working with is the Person element. Since Elements only returns nodes that are direct children it would not work to retrieve the fields so I used Descendants instead.

To enumerate the results you can do this:

foreach (var person in result)
{
    Console.WriteLine("Person Id: {0}", person.Id);
    foreach (var field in person.Fields)
    {
        Console.Write("  Field Id: {0}", field.Id);
        Console.WriteLine("  Field Value: {0}", field.Value);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文