代码之家  ›  专栏  ›  技术社区  ›  user6216224

在c中处理复杂类型的xml读取器#

  •  0
  • user6216224  · 技术社区  · 10 年前

    例如,我有以下XML: 我想用XML阅读器读取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读取器是否还有其他方法,或者这是唯一的方法?

    R3转z

    4 回复  |  直到 10 年前
        1
  •  0
  •   jdweng    10 年前

    这是最好的方法。始终工作无误。使用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);
                        }
                    }
                }
            }
        }
    }
    
        2
  •  0
  •   user6216224 user6216224    10 年前

    谢谢你的回答。但我试图要求使用另一种方法WITH THE XML-READER。我会看看另一个

        3
  •  0
  •   Alexander Petrov    10 年前

    如果只有一个元素 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 名称 ,并且必须适当考虑嵌套级别,我们必须使代码复杂化:

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

    在我看来,它更优雅和正确。

        4
  •  0
  •   Ahmet Bilal Demirkan    5 年前

    你知道如何尝试,但在“名称”部分写下你使用的文件是值得一试的,伙计。

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