在c#中处理复杂类型的xml-reader

时间:2016-04-23 20:26:48

标签: c# xml

例如我有以下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

4 个答案:

答案 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);
}

如果有许多节点Sendername,并且必须正确考虑嵌套级别,我们必须使代码复杂化:

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
                                            }
                                    }
                                }
                            }
                        }