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

bvk5enib  于 2022-12-06  发布在  其他
关注(0)|答案(4)|浏览(132)

我有一个服务用户的集合,我想遍历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>

我的代码看起来像这样,但我得到空点异常。

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);
}
5jdjgkvh

5jdjgkvh1#

我使用XmlSerializer.Deserialize Method中的示例作为下面读取所提供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;}
}
cqoc49vn

cqoc49vn2#

我认为问题的根源是你的尾随“s”,简而言之,你迭代了ServiceUser而不是ServiceUsers
总之这条贯穿细:

[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."}");
    }
}
e0bqpujr

e0bqpujr3#

正如雷劈所说:XML是区分大小写的。下一个问题是.Descendants()返回所有的后代节点,嵌套的节点,等等,在这个例子中是12个节点。所以即使你修复了一个“错字”,NullPointerException也会发生。
以下是您的固定代码:

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
}
ni65a41a

ni65a41a4#

使用doc.Element("ServiceUsers").Elements()获取<ServiceUser>元素,然后在嵌套循环中遍历这些元素的子值。

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("---");
}

印刷品:

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

注意:Elements()会取得(直接)子元素,而Descendants()会传回所有子代。使用Elements()可以让您更好地控制,并让您取得依使用者分组的属性。
您还可以获得一个特定的属性,如serviceUser.Element("USER_NAME").Value。请注意,标记名称是区分大小写的!

相关问题