如何在解析时循环遍历 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");
}
}
}
我正在尝试编写代码以在 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");
}
}
}