简体   繁体   English

如何从 LINQ 获取节点元素值?

[英]how can i get node Element value From LINQ?

i have a collection of service users, i want to iterate over ServiceUsers and extract value from ServiceUser, (ID, USER_NAME, UN_ID, IP, NAME)我有一组服务用户,我想遍历 ServiceUsers 并从 ServiceUser 中提取值,(ID、USER_NAME、UN_ID、IP、NAME)

 <ServiceUsers xmlns="">
  <ServiceUser>
    <ID>280334</ID>
    <USER_NAME>YVELAMGAMOIYENET12:206322102</USER_NAME>
    <UN_ID>731937</UN_ID>
    <IP>91.151.136.178</IP>
    <NAME>?????????????????????: 123456</NAME>
  </ServiceUser>
  <ServiceUser>
    <ID>266070</ID>
    <USER_NAME>ACHIBALANCE:206322102</USER_NAME>
    <UN_ID>731937</UN_ID>
    <IP>185.139.56.37</IP>
    <NAME>123456</NAME>
  </ServiceUser>
</ServiceUsers>

my Code looks like this, but i am getting null point exception.我的代码看起来像这样,但我得到 null 点异常。

XDocument doc = XDocument.Parse(xml)
List<XElement> xElementList = doc.Element("ServiceUsers").Descendants().ToList();
foreach (XElement element in xElementList)
{
    string TEST= element.Element("Name").Value;

    comboBoxServiceUser.Items.Add(element.Element("Name").Value);
}

Use doc.Element("ServiceUsers").Elements() to get the <ServiceUser> elements.使用doc.Element("ServiceUsers").Elements()获取<ServiceUser>元素。 Then you can loop over the child values of those in a nested loop.然后,您可以循环遍历嵌套循环中的子值。

var doc = XDocument.Parse(xml);
foreach (XElement serviceUser in doc.Element("ServiceUsers").Elements()) {
    foreach (XElement element in serviceUser.Elements()) {
        Console.WriteLine($"{element.Name} = {element.Value}");
    }
    Console.WriteLine("---");
}

Prints:印刷:

ID = 280334
USER_NAME = YVELAMGAMOIYENET12:206322102
UN_ID = 731937
IP = 91.151.136.178
NAME = ?????????????????????: 123456
---
ID = 266070
USER_NAME = ACHIBALANCE:206322102
UN_ID = 731937
IP = 185.139.56.37
NAME = 123456
---

Note: Elements() gets the (immediate) child elements where as Descendants() returns all descendants.注意: Elements()获取(直接)子元素,其中Descendants()返回所有后代。 Using Elements() gives you a better control and allows you to get the properties grouped by user.使用Elements()可以为您提供更好的控制,并允许您获取按用户分组的属性。

You can also get a specific property like this serviceUser.Element("USER_NAME").Value .您还可以获取特定属性,例如serviceUser.Element("USER_NAME").Value Note that the tag names are case sensitive请注意,标签名称区分大小写

I think the basis of the problem is your trailing 's' to put it short, You iterate ServiceUser not ServiceUsers我认为问题的基础是你的尾随's'简而言之,你迭代 ServiceUser 而不是 ServiceUsers

Anyway this runs through fine:无论如何,这很好:

[Fact]
public void CheckIteratorTest()
{
    var a = Assembly.GetExecutingAssembly();
    string[] resourceNames = a.GetManifestResourceNames();
    string nameOf = resourceNames.FirstOrDefault(x => x.Contains("SomeXml"));
    Assert.NotNull(nameOf);

    using var stream = a.GetManifestResourceStream(nameOf);
    Assert.NotNull(stream);

    var reader = new StreamReader(stream, Encoding.UTF8);
    var serialized = reader.ReadToEnd();

    var doc = XDocument.Parse(serialized);

    var elemList = doc.Root.Elements("ServiceUser").ToList();
    Assert.NotEqual(0, elemList.Count);
    foreach(var serviceUser in elemList)
    {
        System.Diagnostics.Debug.WriteLine($"Name : {serviceUser.Name ?? "n.a."}");
    }
}

I used the example from XmlSerializer.Deserialize Method as the base for the following snippet that reads the provided xml.我使用XmlSerializer.Deserialize 方法中的示例作为以下片段的基础,该片段读取提供的 xml。

var serializer = new XmlSerializer(typeof(ServiceUsers));

ServiceUsers i;

using (TextReader reader = new StringReader(xml))
{
    i = (ServiceUsers)serializer.Deserialize(reader);
}

[XmlRoot(ElementName = "ServiceUsers")]  
public class ServiceUsers : List<ServiceUser> 
{
}

public class ServiceUser 
{
    [XmlElement(ElementName = "ID")]
    public string Id {get; set;}
}

As being said: XML is case-sensitive.如前所述: XML 区分大小写。 Next issue is .Descendants() returns all the descendant nodes, nested ones, etc, 12 nodes in this case.下一个问题是.Descendants()返回所有后代节点、嵌套节点等,在这种情况下为 12 个节点。 So NullPointerException will happen even if you fix a "typo".因此,即使您修复了“错字”,也会发生 NullPointerException。

Here is your fixed code:这是您的固定代码:

XDocument doc = XDocument.Parse(xml);
var xElementList = doc
    .Element("ServiceUsers") // picking needed root node from document
    .Elements("ServiceUser") // picking exact ServiceUser nodes
    .Elements("NAME")  // picking actual NAME nodes
    .ToList();
foreach (XElement element in xElementList)
{
    var TEST = element.Value;
    Console.WriteLine(TEST); // do what you were doing instead of console
}

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

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