簡體   English   中英

如何從C#中的xml讀取特定節點?

[英]How to read a particular node from xml in C#?

我有以下XML:

<Loop Name="MasterData">
  <Loop Name="SlaveData">
    <Segment Name="AAA">
      <Node1>hello</Node1>
      <Node2>john</Node2>
      <Node3>hi</Node3>
      <Node4>marry</Node4>
    </Segment>
    <Segment Name="BBB">
      <Node1>00</Node1>
      <Node2> </Node2>
      <Node3>00</Node3>
      <Node4> </Node4>
    </Segment> 
   </Loop>
</Loop>

我必須讀取每個節點的值,即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節點,然后循環迭代其所有子節點。

嘗試這個:

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<string> result = new List<string>();

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

您可以使用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;
    // ...
}

如果你曾經使用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<string> nodeDetails = new List<string>();

       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, <br/> My XML File Is like: <br/> < People> <br/> < GroupName Name="NY"><br/> < Address1>1540 Broadway< /Address1> <br/> < State>NY< /State> <br/> < City>New York< /City> <br/> < ZipCode>10036< /ZipCode> <br/> < /GroupName><br/><br/> < GroupName Name="TX"> <br/> < Address1>1755 Wittington Place< /Address1> <br/> < State>TX< /State> <br/> < City>Dallas< /City> <br/> < ZipCode>75234< /ZipCode> <br/> < /GroupName><br/><br/> < GroupName Name="Gr"> <br/> < Address1>124 Platinum< /Address1> <br/> < State>MH< /State> <br/> < City>Mum< /City> <br/> < ZipCode>400221< /ZipCode> <br/> < /GroupName><br/><br/> < /People><br/> In Code behind file :<br/> 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(); <br/><br/><br/> strName = xmlData.Name;<br/> strAdd = xmlData.Add;<br/> strState = xmlData.State;<br/> <br/> Hope this will be perfect answer for your question. 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM