[英]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.