如何在解析时循环遍历 xml 文档?

How do I loop through xml document while parsing?

我正在尝试编写代码以在 C# 中解析 XML。到目前为止,我所写的确实是从第一组标签中提取指定的元素标签,但我需要它遍历整个文档。

为了让它循环,我尝试添加一个 for 循环 foreach (XElement element in xdoc.Root.Nodes()) 但它仍然重复地只打印第一个元素。任何指导或帮助都会很棒。

完整代码如下:

using System;
using System.Xml.XPath;
using System.Xml;
using System.Xml.Linq;
using System.Threading;

namespace ParsePlease
{
    class Program
    {
            static void Main()
            {
                var xdoc = XDocument.Load("myxml.xml");
                var ns = xdoc.Root.GetDefaultNamespace();

                XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
                nsmgr.AddNamespace("ns", "urn:deployment-manifest-schema");
             
            var xpath0 = "ns:SPObject[@ObjectType='SPListItem']/ns:ListItem/ns:Fields/ns:Field[@Name='Title']";
                var xpath1 = "ns:SPObject[@ObjectType='SPListItem']/ns:ListItem/ns:Fields/ns:Field[@Name='Global']";
                var xpath2 = "ns:SPObject[@ObjectType='SPListItem']/ns:ListItem/ns:Fields/ns:Field[@Name='Questions']";

            var parameter0 = xdoc.Root.XPathSelectElement(xpath0, nsmgr);
            var value0 = (string)parameter0.Attribute("Value");

            var parameter1 = xdoc.Root.XPathSelectElement(xpath1, nsmgr);
            var value1 = (string)parameter1.Attribute("Value");

            var parameter2 = xdoc.Root.XPathSelectElement(xpath2, nsmgr);
            var value2 = (string)parameter2.Attribute("Value");

            Console.WriteLine("Title: " + value0 + "\nGlobal: " + value1 + "\nNum. of Questions: " + value2 + "\n");
            Console.Read();
            }
        }
    }

XML 文档看起来像:


    <Fields>
        <Field Name="Title" Value="FAQ: Agilis 3 " FieldId="fa56" />
        <Field Name="Global" Value="1b46b70c-" FieldId="2aeb" />
        <Field Name="Questions" Value="7" FieldId="ef95e" />
      </Fields>

<Fields>
        <Field Name="Title" Value="FAQ: Agilis" FieldId="fa56" />
        <Field Name="Global" Value="c48351c5" FieldId="2aeb" />
        <Field Name="Questions" Value="10" FieldId="ef95" />
      </Fields>

XML 文档中还有一堆其他废话,但这些是我需要的元素标签。

这是我想出的,我对其进行了调整,使其打印到文件和控制台。感谢您的建议。

using System;
using System.Xml.XPath;
using System.Xml;
using System.Xml.Linq;
using System.Threading;
using System.Linq;
using System.IO;


namespace ParsePlease
{
    class Program
    {
        static void Main()
        {

            FileStream ostrm;
            StreamWriter writer;
            TextWriter oldOut = Console.Out;
            ostrm = new FileStream("Manifest.txt", FileMode.OpenOrCreate, FileAccess.Write);
            writer = new StreamWriter(ostrm);

            var xdoc = XDocument.Load("myXml.xml");
            var ns = xdoc.Root.GetDefaultNamespace();

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
            nsmgr.AddNamespace("ns", "urn:deployment-manifest-schema");
            var xpath0 = "//ns:SPObject[@ObjectType='SPListItem']/ns:ListItem/ns:Fields/ns:Field[@Name='Title']";
            var xpath1 = "//ns:SPObject[@ObjectType='SPListItem']/ns:ListItem/ns:Fields/ns:Field[@Name='Answer']";

            var xpathList0 = xdoc.XPathSelectElements(xpath0, nsmgr);
            var parameter0 = xpathList0.Attributes("Value").ToList();

            var xpathList1 = xdoc.XPathSelectElements(xpath1, nsmgr);
            var parameter1 = xpathList1.Attributes("Value").ToList();

            foreach (var xElement in parameter0)
            {
                foreach (var xElement1 in parameter1)
                {
                    Console.WriteLine(xElement);
                    Console.WriteLine(xElement1 + "\n");
                    writer.WriteLine(xElement);
                    writer.WriteLine(xElement1 + "\n");
                }
            }
            Console.Read();

            writer.Close();
            ostrm.Close();
            Console.WriteLine("Done");
        }
    }

}