19

XMLファイルがあり、各子ノードが情報を収集することを繰り返したいと思います。

これが私のC#コードで、1つのノードのみを取得します。FieldDataは、その子ノードでforeachを使用します。

public void LoadXML() {
    if (File.Exists("Data.xml")) {
        //Reading XML
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load("Data.xml");

        //Think something needs to reference Child nodes, so i may Foreach though them

        XmlNodeList dataNodes = xmlDoc.SelectNodes("//FieldData"); 
        TagContents[] ArrayNode;

        foreach(XmlNode node in dataNodes) {
            int Count = 0;
            //int Max = node.ChildNodes.Count;
            ArrayNode = new TagContents[Max];

            ArrayNode[Count].TagName = node.Name;
            ArrayNode[Count].TagValue = node.SelectSingleNode(ArrayNode[Count].TagName).InnerText;
            Count = Count + 1;        
        }
    } else {
        MessageBox.Show("Could not find file Data.xml");
    }
}

私のXMLは次のようになります。

<?xml version="1.0"?>
<FieldData>
  <property_details_branch IncludeInPDFExport="Yes" Mod="20010101010101"/>
  <property_details_inspection_date IncludeInPDFExport="Yes" Mod="20120726200230">20120727220230+0200</property_details_inspection_date>
  <property_details_type_of_ownership IncludeInPDFExport="Yes" Mod="20120726134107">Freehold</property_details_type_of_ownership>
</FieldData>
4

7 に答える 7

26

FieldDataノードを反復処理していて、1つしかありません。子ノードを繰り返すには、次のように記述します。

foreach (XmlNode node in dataNodes)
{
     foreach (XmlNode childNode in node.ChildNodes)
     {
于 2012-08-01T12:45:59.123 に答える
7

私は通常、この種のことにはLinq-To-Xmlを好みます。

  var doc = XDocument.Load("XMLFile1.xml");
  foreach (var child in doc.Element("FieldData").Elements())
  {
    Console.WriteLine(child.Name);
  }
于 2012-08-01T12:53:52.510 に答える
5

または、再帰を使用します。

    public void findAllNodes(XmlNode node)
    {
        Console.WriteLine(node.Name);
        foreach (XmlNode n in node.ChildNodes)
            findAllNodes(n);
    }

ペイロードをどこに配置するかは、使用する検索の種類によって異なります(たとえば、幅優先検索、深さ優先検索など。http://en.wikipedia.org/wiki/Euler_tour_techniqueを参照) 。

于 2012-08-02T06:20:56.950 に答える
2

あなたはこのようにそれを行うことができます:

    XDocument doc = XDocument.Load(@"Data.xml");
    TagContents[] ArrayNode = doc.Root
                                .Elements()
                                .Select(el =>
                                    new TagContents()
                                    {
                                        TagName = el.Name.ToString(),
                                        TagValue = el.Value
                                    })
                                .ToArray();
于 2012-08-01T12:54:55.417 に答える
0

@Waynesの回答に触れるだけで、うまくいきました。以下のコードを使用して、xmlの子ノードにさらにプッシュしました

foreach (var child in doc.Element("rootnodename").Element("nextchildnode").Elements()) 

{

 //do work here, probs async download xml content to file on local disc

} 
于 2015-06-20T23:32:32.550 に答える
0
    public void ValidateXml(string[] Arrays)
    {                                         
        foreach (var item in Arrays)
        {
            Xdoc.Load(item);                              
            XmlNodeList xnList = Xdoc.SelectNodes("FirstParentNode");
            if (xnList.Count > 0)
            {
                foreach (XmlNode xn in xnList)
                {
                    XmlNodeList anode = xn.SelectNodes("SecondParentNode");
                    if (anode.Count > 0)
                    {
                        foreach (XmlNode bnode in anode)
                        {                               
                            string InnerNodeOne = bnode["InnerNode1"].InnerText;
                            string InnerNodeTwo = bnode["InnerNode1"].InnerText;

                        }                           
                    }
                    else
                    {
                        ErrorLog("Parent Node DoesNot Exists");                                                 
                    }
                }                  
            }
            else
            {
                ErrorLog("Parent Node DoesNot Exists");
            }

        }
       //then insert or update these values in database here
    }
于 2017-07-18T07:15:33.110 に答える
0

すべての子ノード、サブ子ノードなどを反復処理するには、を使用する必要がありますRecursion。誰かが私と同じ要件を持っている場合、私はこれを以下のように達成しました-

public string ReadAllNodes(XmlNode node)
{
    if (node.ChildNodes.Count > 0)
    {
        foreach (XmlNode subNode in node)
        {
            //Recursion
            ReadAllNodes(subNode);
        }
    }
    else //Get the node value.
    {
        finalText = finalText + node.InnerText + System.Environment.NewLine;
    }
    return finalText;
}
于 2018-09-13T13:08:13.077 に答える