如何从C#中的xml读取特定节点?

我有以下XML:

   hello john hi marry   00   00      

我必须读取每个节点的值,即Node1,Node2,Node3,Node4,它们属于Segment节点,其属性即Name = "AAA" 。 我怎样才能做到这一点。 我指的是来自stackoverflow的以下链接,但那不适合我。

如何从C#中的XmlNode读取属性值?

我需要像这样的输出

让我有四个sting变量strNode1, strNode2, strNode3, strNode4 。 我想将值存储在以上四个变量中,如下所示

 strNode1 = "hello" strNode2 = "john" strNode3 = "hi" strNode4 = "marry" 

您可以使用XmlDocument将xml作为对象加载,然后使用XPath查询所需的特定节点。 您的xpath查询(我现在无法测试)可能看起来像这样。

 XmlNodeList xNodes = xmlDocument.SelectNodes("//Segment[@Name = 'AAA']"); 

我建议使用XDocument(基于父节点的NB特定过滤等省略):

 var document = XDocument.Load(path); var nodes = document.Descendents().Where(e => e.Name.LocalName.StartsWith("Node")); 

更新以包括父元素的过滤

 var nodes = document.Descendents() .Where(e => e.Atrributes().Any(a => a.Name.localName == "Name" && a.Value == "AAA")) .SelectMany(e => e.Descendents().Where(e => e.Name.LocalName.StartsWith("Node")); var values = nodes.Select(n => n.Value).ToList(); // This will be a list containing "hello", "john, "hi", "marry" 

我找到了解决问题的简单方法

 XmlNodeList xnList = doc.SelectNodes("/Loop/Loop/Segment[@Name='AAA']"); foreach (XmlNode xn in xnList) { if (xn.HasChildNodes) { foreach (XmlNode item in xn.ChildNodes) { Console.WriteLine(item.InnerText); } } } 

假设您有一个XmlDocument您可以使用XPath:

 XmlNode node = doc.SelectSingleNode("//Segment[@Name='AAA']"); 

获取Segment节点,然后在循环中迭代其所有子节点。

您可以使用XmlDocument和XPath:

 XmlDocument doc = new XmlDocument(); doc.Load(xml); foreach(XmlNode node in doc.SelectNodes("//Segment[@Name='AAA']/node()")) { string name = node.Name; string value = node.innerText; // ... } 

试试这个:

 System.Xml.Linq.XDocument doc = XDocument.Load(your file); var nodes = doc.Element("Loop").Element("Loop").Elements("Segment") .Where(input => (string)input.Attribute("Name") == "AAA") .Select(input => input.Elements()).ToList(); 

然后:

 List result = new List(); foreach (List item in nodes) { result.AddRange(item.Select(i => i.Value)); } 

如果你曾经使用linq-to-entities或linq-to-sql,你可以使用linq-to-xml 。

你能尝试一下吗?

 XDocument xmlFile = XDocument.Load("myFile.xml"); foreach (var nodeSegment in xmlFile.Descendants("Loop")) { foreach (var nodes in nodeSegment.Descendants().Where(e => e.Name.LocalName.StartsWith("Node"))) { } } 

试试这个……

 List nodeDetails = new List(); var nodes = from n in XDocument.Load(@"D:\pfXml.xml") .Element("Loop") .Element("loop") .Elements("Segment") where (string)n.Attribute("Name") == "AAAA" select new { n1 = n.Element("Node1").Value, n2 = n.Element("Node2").Value, n3 = n.Element("Node3").Value, n4 = n.Element("Node4").Value }; foreach (var node in nodes) { nodeDetails.Add(node.n1); nodeDetails.Add(node.n2); nodeDetails.Add(node.n3); nodeDetails.Add(node.n4); } 
 This might help u, 
My XML File Is like:
< People>
< GroupName Name="NY">
< Address1>1540 Broadway< /Address1>
< State>NY< /State>
< City>New York< /City>
< ZipCode>10036< /ZipCode>
< /GroupName>

< GroupName Name="TX">
< Address1>1755 Wittington Place< /Address1>
< State>TX< /State>
< City>Dallas< /City>
< ZipCode>75234< /ZipCode>
< /GroupName>

< GroupName Name="Gr">
< Address1>124 Platinum< /Address1>
< State>MH< /State>
< City>Mum< /City>
< ZipCode>400221< /ZipCode>
< /GroupName>

< /People>
In Code behind file :
System.Xml.Linq.XDocument doc = XDocument.Load(Path of XML); var xmlData = (from p in doc.Descendants("People").Descendants("GroupName") let Name = (p.Attribute("Name").Value) where Name.Equals("NY") select new {Name = Name, Add = p.Element("Address1").Value, State = p.Element("State").Value}).Single();


strName = xmlData.Name;
strAdd = xmlData.Add;
strState = xmlData.State;

Hope this will be perfect answer for your question.