C# XmlReader在C中的工作原理#

C# XmlReader在C中的工作原理#,c#,xml,xmlreader,C#,Xml,Xmlreader,我试图从我制作的字符串中读取一些Xml,但实际上任何Xml文件都可以 我只想像浏览多维矩阵一样浏览Xml节点,并最终将它们放在一个数据表中(将它们放在一个带有SqlBulkCopy的sql server中)。我已经在MSDN和附近看过了。有人能简单明了地解释一下吗 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Ta

我试图从我制作的字符串中读取一些Xml,但实际上任何Xml文件都可以

我只想像浏览多维矩阵一样浏览Xml节点,并最终将它们放在一个数据表中(将它们放在一个带有SqlBulkCopy的sql server中)。我已经在MSDN和附近看过了。有人能简单明了地解释一下吗

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Xml;
using System.IO;

namespace ConsoleApplication2
{
    class Program
    {
        private static DataTable table = new DataTable();
        private static String xmlString =
        @"<?xml version='1.0'?>
        <!-- This is a sample XML document -->
        <Garage>
            <Car>
                <Name>Ferrari</Name>
                <Speed>360km/h</Speed>
                <Engine>Ferrari Enzo</Engine>
                <Color>Red</Color>
                <Year>1999</Year>
            </Car>
            <Car>
                <Name>Maserati</Name>
                <Speed>270km/h</Speed>
                <Color>Metal Grey</Color>
                <Year>2007</Year>
            </Car>
            <Car>
                <Name>Limo</Name>
                <Color>Black</Color>
                <Engine>Chevrolet</Engine>
                <Year>2007</Year>
            </Car>
        </Garage>";

        static void Main(string[] args)
        {
            Program x = new Program();
            XmlReader reader = XmlReader.Create(new StringReader(xmlString));
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    Console.WriteLine(XmlNodeType.Element.ToString());
                    }
                }
            }

        }
    }
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用系统数据;
使用System.Xml;
使用System.IO;
命名空间控制台应用程序2
{
班级计划
{
私有静态数据表=新数据表();
私有静态字符串xmlString=
@"
法拉利
360km/h
法拉利
红色
1999
玛莎拉蒂
270km/h
金属灰
2007
豪华轿车
黑色
雪佛兰
2007
";
静态void Main(字符串[]参数)
{
程序x=新程序();
XmlReader=XmlReader.Create(新建StringReader(xmlString));
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Element)
{
WriteLine(XmlNodeType.Element.ToString());
}
}
}
}
}
我想循环整个过程,得到如下结果:

姓名:法拉利 速度:360km/h 引擎:法拉利恩佐

依此类推,你得到了训练。

将给你一份
XDocument
XDocument.Root将为您获取文档的Root
XElement
。我想你会发现这很容易处理

您正在尝试使用.NET中的上一代XML工具—较新的
XDocument
XElement
等工具更易于访问


示例代码
辅助类
公共静态类XmlHelper
{
公共静态XNode读取自(流)
{
使用(var xmlReader=xmlReader.Create(stream))
返回XDocument.Load(xmlReader);
}
公共静态void WriteTo(流,XNode节点)
{
使用(var xmlWriter=xmlWriter.Create(stream))
node.WriteTo(xmlWriter);
}
公共静态XElement ToFirst(此XElement祖先,字符串后代LocalName)
{
返回祖先.subjects().FirstOrDefault(element=>element.Name.LocalName==genderantLocalName);
}
公共静态IEnumerable ToAll(此XElement祖先,字符串后代LocalName)
{
返回祖先.subjects().Where(element=>element.Name.LocalName==genderantlocalname);
}
公共静态字符串ToAttribute(此XElement元素,字符串名称)
{
var attribute=element.attribute(XName.Get(name));
返回属性!=null?属性。值:null;
}
}
将为您提供一份
XDocument
XDocument.Root将为您获取文档的Root
XElement
。我想你会发现这很容易处理

您正在尝试使用.NET中的上一代XML工具—较新的
XDocument
XElement
等工具更易于访问


示例代码
辅助类
公共静态类XmlHelper
{
公共静态XNode读取自(流)
{
使用(var xmlReader=xmlReader.Create(stream))
返回XDocument.Load(xmlReader);
}
公共静态void WriteTo(流,XNode节点)
{
使用(var xmlWriter=xmlWriter.Create(stream))
node.WriteTo(xmlWriter);
}
公共静态XElement ToFirst(此XElement祖先,字符串后代LocalName)
{
返回祖先.subjects().FirstOrDefault(element=>element.Name.LocalName==genderantLocalName);
}
公共静态IEnumerable ToAll(此XElement祖先,字符串后代LocalName)
{
返回祖先.subjects().Where(element=>element.Name.LocalName==genderantlocalname);
}
公共静态字符串ToAttribute(此XElement元素,字符串名称)
{
var attribute=element.attribute(XName.Get(name));
返回属性!=null?属性。值:null;
}
}

XmlReader
是XML节点的只读前向读取器。这不是你想要的,所以不要用它。我喜欢人们无缘无故地不喜欢它。不管怎样,我应该用什么来代替呢?他们“否决票”是因为你没有在你的问题上下功夫。下面给出了答案。请在发帖之前阅读并了解您的发帖位置。你给人的印象不好。你没有读过这本书,是吗?也许也可以试着阅读。这不是你想象中的那种地方。
XmlReader
是XML节点的只读前向读取器。这不是你想要的,所以不要用它。我喜欢人们无缘无故地不喜欢它。不管怎样,我应该用什么来代替呢?他们“否决票”是因为你没有在你的问题上下功夫。下面给出了答案。请在发帖之前阅读并了解您的发帖位置。你给人的印象不好。你没有读过这本书,是吗?也许也可以试着阅读。这不是你想象中的那种地方。呃,这种语法更糟糕,因为我不知道LINQ是什么,也不知道它是如何工作的,所以我无法从那里提取它们。我完全不知道你的助手类做什么。XML自然是一个树结构。LINQ非常适合处理这种形式的数据。我提供的助手扩展方法以及标准LINQ方法使在C#/.NET中使用XML变得轻而易举。看一看我编写的示例代码,并使sur
using System.Xml.Linq;
...
var root = XDocument.Parse(xmlString).Root;

var cars = root
    .ToAll("Car")
    .Select(car => new
    {
        Name = car.ToFirst("Name").Value,
        Speed = car.ToAll("Speed").Any() ? car.ToFirst("Speed").Value : null,
        Color = car.ToFirst("Color").Value,
        Engine = car.ToFirst("Engine").Value,
        Year = int.Parse(car.ToFirst("Year").Value)
    })
    .ToList();
public static class XmlHelper
{
    public static XNode ReadFrom(Stream stream)
    {
        using (var xmlReader = XmlReader.Create(stream))
            return XDocument.Load(xmlReader);
    }

    public static void WriteTo(Stream stream, XNode node)
    {
        using (var xmlWriter = XmlWriter.Create(stream))
            node.WriteTo(xmlWriter);
    }

    public static XElement ToFirst(this XElement ancestor, String descendantLocalName)
    {
        return ancestor.Descendants().FirstOrDefault(element => element.Name.LocalName == descendantLocalName);
    }

    public static IEnumerable<XElement> ToAll(this XElement ancestor, String descendantLocalName)
    {
        return ancestor.Descendants().Where(element => element.Name.LocalName == descendantLocalName);
    }

    public static string ToAttribute(this XElement element, string name)
    {
        var attribute = element.Attribute(XName.Get(name));
        return attribute != null ? attribute.Value : null;
    }
}