C# 使用XmlReader获取最后一个子元素
假设我有这个XML:C# 使用XmlReader获取最后一个子元素,c#,xml,C#,Xml,假设我有这个XML: <fields> <field fieldid="fdtElem3Group"> <value actionid="1" actiontype="review">123456789</value> <value actionid="2" actiontype="review">123456789</value> <val
<fields>
<field fieldid="fdtElem3Group">
<value actionid="1" actiontype="review">123456789</value>
<value actionid="2" actiontype="review">123456789</value>
<value actionid="3" actiontype="review">123456789</value>
<value actionid="4" actiontype="review">123456789</value>
<value actionid="5" actiontype="review">123456789</value>
</field>
<field fieldid="fdtElem7Group">
<value actionid="1" actiontype="review">29/10/75</value>
<value actionid="2" actiontype="review">29/10/74</value>
<value actionid="3" actiontype="review">29/10/74</value>
<value actionid="4" actiontype="review">29/10/76</value>
<value actionid="5" actiontype="review">29/10/74</value>
</field>
</fields>
抱歉,现在请阅读您正在寻找的xmReader解决方案。但是使用XDocument和Linq,您可以执行以下操作:
string xml = @"<fields>
<field fieldid=""fdtElem3Group"">
<value actionid=""1"" actiontype=""review"">123456789</value>
<value actionid=""2"" actiontype=""review"">123456789</value>
<value actionid=""3"" actiontype=""review"">123456789</value>
<value actionid=""4"" actiontype=""review"">123456789</value>
<value actionid=""5"" actiontype=""review"">123456789</value>
</field>
<field fieldid=""fdtElem7Group"">
<value actionid=""1"" actiontype=""review"">29/10/75</value>
<value actionid=""2"" actiontype=""review"">29/10/74</value>
<value actionid=""3"" actiontype=""review"">29/10/74</value>
<value actionid=""4"" actiontype=""review"">29/10/76</value>
<value actionid=""5"" actiontype=""review"">29/10/74</value>
</field>
</fields>";
var xmlDoc = XDocument.Parse(xml).Root;
var lastElements = xmlDoc.Descendants("field").Select(x => x.LastNode);
stringxml=@”
123456789
123456789
123456789
123456789
123456789
29/10/75
29/10/74
29/10/74
29/10/76
29/10/74
";
var xmlDoc=XDocument.Parse(xml).Root;
var lastElements=xmlDoc.substands(“字段”).Select(x=>x.LastNode);
对不起,现在请阅读您正在寻找的xmReader解决方案。但是使用XDocument和Linq,您可以执行以下操作:
string xml = @"<fields>
<field fieldid=""fdtElem3Group"">
<value actionid=""1"" actiontype=""review"">123456789</value>
<value actionid=""2"" actiontype=""review"">123456789</value>
<value actionid=""3"" actiontype=""review"">123456789</value>
<value actionid=""4"" actiontype=""review"">123456789</value>
<value actionid=""5"" actiontype=""review"">123456789</value>
</field>
<field fieldid=""fdtElem7Group"">
<value actionid=""1"" actiontype=""review"">29/10/75</value>
<value actionid=""2"" actiontype=""review"">29/10/74</value>
<value actionid=""3"" actiontype=""review"">29/10/74</value>
<value actionid=""4"" actiontype=""review"">29/10/76</value>
<value actionid=""5"" actiontype=""review"">29/10/74</value>
</field>
</fields>";
var xmlDoc = XDocument.Parse(xml).Root;
var lastElements = xmlDoc.Descendants("field").Select(x => x.LastNode);
stringxml=@”
123456789
123456789
123456789
123456789
123456789
29/10/75
29/10/74
29/10/74
29/10/76
29/10/74
";
var xmlDoc=XDocument.Parse(xml).Root;
var lastElements=xmlDoc.substands(“字段”).Select(x=>x.LastNode);
希望这有帮助
static void Main(string[] args)
{
string xml = @"<fields><field fieldid='fdtElem3Group'><value actionid='1' actiontype='review'>123456789</value><value actionid='2' actiontype='review'>123456789</value><value actionid='3' actiontype='review'>123456789</value><value actionid='4' actiontype='review'>123456789</value><value actionid='5' actiontype='review'>123456789</value></field><field fieldid='fdtElem7Group'><value actionid='1' actiontype='review'>29/10/75</value> <value actionid='2' actiontype='review'>29/10/74</value><value actionid='3' actiontype='review'>29/10/74</value><value actionid='4' actiontype='review'>29/10/76</value><value actionid='5' actiontype='review'>29/10/74</value></field></fields>";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
foreach (XmlNode item in xmlDocument.DocumentElement.ChildNodes)
{
Console.WriteLine(item.LastChild.InnerXml);
}
Console.ReadKey();
}
static void Main(字符串[]args)
{
字符串xml=@“12345678912345678912345678912345678912345678929/10/7529/10/7429/10/7429/10/7629/10/74”;
XmlDocument XmlDocument=新的XmlDocument();
LoadXml(xml);
foreach(xmlDocument.DocumentElement.ChildNodes中的XmlNode项)
{
WriteLine(item.LastChild.InnerXml);
}
Console.ReadKey();
}
希望这有帮助
static void Main(string[] args)
{
string xml = @"<fields><field fieldid='fdtElem3Group'><value actionid='1' actiontype='review'>123456789</value><value actionid='2' actiontype='review'>123456789</value><value actionid='3' actiontype='review'>123456789</value><value actionid='4' actiontype='review'>123456789</value><value actionid='5' actiontype='review'>123456789</value></field><field fieldid='fdtElem7Group'><value actionid='1' actiontype='review'>29/10/75</value> <value actionid='2' actiontype='review'>29/10/74</value><value actionid='3' actiontype='review'>29/10/74</value><value actionid='4' actiontype='review'>29/10/76</value><value actionid='5' actiontype='review'>29/10/74</value></field></fields>";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
foreach (XmlNode item in xmlDocument.DocumentElement.ChildNodes)
{
Console.WriteLine(item.LastChild.InnerXml);
}
Console.ReadKey();
}
static void Main(字符串[]args)
{
字符串xml=@“12345678912345678912345678912345678912345678929/10/7529/10/7429/10/7429/10/7629/10/74”;
XmlDocument XmlDocument=新的XmlDocument();
LoadXml(xml);
foreach(xmlDocument.DocumentElement.ChildNodes中的XmlNode项)
{
WriteLine(item.LastChild.InnerXml);
}
Console.ReadKey();
}
如果不想将整个XML加载到XML文件中(例如,它非常大),可以采用混合方法,使用XmlReader
迭代XML文件中的
和
元素,将每个
元素加载到XElement
,然后选择每个父级的最后一个
。无论XML文件增长多大,这都可以保持内存占用小且恒定
首先介绍以下两种扩展方法:
public static class XmlReaderExtensions
{
public static IEnumerable<IEnumerable<XElement>> ReadNestedElements(this XmlReader xmlReader, string outerName, string innerName)
{
while (!xmlReader.EOF)
{
if (xmlReader.NodeType == System.Xml.XmlNodeType.Element && xmlReader.Name == outerName)
{
using (var subReader = xmlReader.ReadSubtree())
{
yield return subReader.ReadElements(innerName);
}
}
xmlReader.Read();
}
}
public static IEnumerable<XElement> ReadElements(this XmlReader xmlReader, string name)
{
while (!xmlReader.EOF)
{
if (xmlReader.NodeType == System.Xml.XmlNodeType.Element && xmlReader.Name == name)
{
var element = (XElement)XNode.ReadFrom(xmlReader);
yield return element;
}
else
{
xmlReader.Read();
}
}
}
}
示例。如果不想将整个XML加载到XML文件中(例如,因为它非常大),可以采用混合方法,使用
XmlReader
迭代XML文件中的
和
元素,将每个
元素加载到XElement
,然后选择每个父级的最后一个
。无论XML文件增长多大,这都可以保持内存占用小且恒定
首先介绍以下两种扩展方法:
public static class XmlReaderExtensions
{
public static IEnumerable<IEnumerable<XElement>> ReadNestedElements(this XmlReader xmlReader, string outerName, string innerName)
{
while (!xmlReader.EOF)
{
if (xmlReader.NodeType == System.Xml.XmlNodeType.Element && xmlReader.Name == outerName)
{
using (var subReader = xmlReader.ReadSubtree())
{
yield return subReader.ReadElements(innerName);
}
}
xmlReader.Read();
}
}
public static IEnumerable<XElement> ReadElements(this XmlReader xmlReader, string name)
{
while (!xmlReader.EOF)
{
if (xmlReader.NodeType == System.Xml.XmlNodeType.Element && xmlReader.Name == name)
{
var element = (XElement)XNode.ReadFrom(xmlReader);
yield return element;
}
else
{
xmlReader.Read();
}
}
}
}
示例。为什么不使用
XDocument
和一些XPath?为什么不使用XDocument
和一些XPath?IMHO比目前在.Net中可用的任何东西都强大得多。IMHO比目前在.Net中可用的任何东西都强大得多。