例如我有以下XML: 我想用XML-Reader读取Sender对象:
<gesmes:Sender>
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
我写了以下解析器:
using (var reader = XmlReader.Create(new FileStream(Console.ReadLine(), FileMode.Open, FileAccess.ReadWrite, FileShare.Read)))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.LocalName)
{
case "Sender":
do
{
reader.Read();
} while (reader.LocalName != "name");
Console.WriteLine("Sended from:" + reader.ReadElementContentAsString());
break;
}
}
}
}
这不是很优雅,是否有另一种方法使用Xml-reader,或者这是唯一的方法?
R3turnz
答案 0 :(得分:0)
这是最好的方法。始终工作没有错误。使用XmlReader和xml Linq。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
using (var reader = XmlReader.Create(new FileStream(Console.ReadLine(), FileMode.Open, FileAccess.ReadWrite, FileShare.Read)))
{
while (!reader.EOF)
{
if (reader.Name != "name")
{
reader.ReadToFollowing("name");
}
if(!reader.EOF)
{
XElement name = (XElement)XElement.ReadFrom(reader);
}
}
}
}
}
}
答案 1 :(得分:0)
谢谢你的回答。但我试图用XML-READER请求另一种方法。我将看看另一个
答案 2 :(得分:0)
如果只有一个元素name
,我们可以使用最简单的代码:
string path = "..."; // path to file
string ns = "..."; // specify correct namespace
using (var reader = XmlReader.Create(path))
{
reader.ReadToFollowing("name", ns);
string name = reader.ReadElementContentAsString();
Console.WriteLine(name);
}
如果有许多节点Sender
和name
,并且必须正确考虑嵌套级别,我们必须使代码复杂化:
using (var reader = XmlReader.Create(path))
{
while (reader.ReadToFollowing("Sender", ns))
{
using (var innerReader = reader.ReadSubtree())
{
if (innerReader.ReadToFollowing("name", ns))
{
string name = innerReader.ReadElementContentAsString();
Console.WriteLine(name);
break;
}
}
}
}
在我看来,它更优雅和正确。
答案 3 :(得分:0)
您知道如何尝试,但是伙计,写在“名称”部分中使用的文件值得一试。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using (XmlReader xmlreader = XmlTextReader.Create(xmlStream))
{
while (xmlreader.Read())
{
if (xmlreader.IsStartElement())
{
switch (xmlreader.Name) // folder variable
{
case "NAME": // xml in label variable
if (xmlreader.Read())
{
Names_List.Add(xmlreader.Value.Trim());
NumLabels += 1; //order of the column in the xml file
}
}
}
}
}