C# 从C中具有相同名称的xml标记中提取值#

C# 从C中具有相同名称的xml标记中提取值#,c#,xml,C#,Xml,我有一个C#.NET应用程序,它包含一个动态生成的xml文档。它跟踪订单信息,比如姓名、下单日期等等。使用innerText提取这些标记中包含的信息没有问题 但是,当我们的客户“创建”订单时,他们可以附加文件 每个文件都保存在标记下的xml文档中 因此,我最终得到了如下(简化的)结果: <order> <Number>1</Number> <Email>example@stack.com</Email> <Dat

我有一个C#.NET应用程序,它包含一个动态生成的xml文档。它跟踪订单信息,比如姓名、下单日期等等。使用innerText提取这些标记中包含的信息没有问题

但是,当我们的客户“创建”订单时,他们可以附加文件

每个文件都保存在标记下的xml文档中

因此,我最终得到了如下(简化的)结果:

<order>
   <Number>1</Number>
   <Email>example@stack.com</Email>
   <Date>2012-08-13</Date>
   <File>File1.txt</File>
   <File>File2.txt</File>
</order>
但是,当我使用name执行此操作时,我会听到一个错误,提示没有设置为实例。。。我完全理解

我的问题是,我如何获得这些信息?可以附加任意数量的文件,从零到用户想要的数量

谢谢您的时间。

下面是代码示例

Order表示xml顺序

[TestFixture]
public class ForTest
{
    [Test]
    public void Test()
    {
        var root = XElement.Load("order.xml");
        var order = CreateOrder(root);
    }

    private Order CreateOrder(XElement element)
    {
        var result = new Order
        {
            Number = int.Parse(element.Element("Number").Value),
             Date = DateTime.Parse(element.Element("Date").Value),
            Email = element.Element("Email").Value,
            Files = element.Descendants("File").Select(x => x.Value).ToList()
        };
        return result;
    }
}
public class Order
{
    public int Number { get; set; }
    public string Email { get; set; }
    public DateTime Date { get; set; }
    public List<string> Files { get; set; }
}
[TestFixture]
公务舱ForTest
{
[测试]
公开无效测试()
{
var root=XElement.Load(“order.xml”);
var order=CreateOrder(根);
}
私有订单CreateOrder(XElement元素)
{
var结果=新订单
{
Number=int.Parse(element.element(“Number”).Value),
Date=DateTime.Parse(element.element(“日期”).Value),
Email=element.element(“Email”).Value,
Files=element.substands(“文件”).Select(x=>x.Value).ToList()
};
返回结果;
}
}
公共阶级秩序
{
公共整数{get;set;}
公共字符串电子邮件{get;set;}
公共日期时间日期{get;set;}
公共列表文件{get;set;}
}

以下是一个基于LINQ的解决方案:

XDocument XMLDoc = XDocument.Load("XMLFile.xml");
var LoadInfo =  from Node in XMLDoc.Descendants("order")                       
                select new
                  {
                    Number = Node.Element("Number").Value,
                    Email = Node.Element("Email").Value,
                    Date = Node.Element("Date").Value,
                    File = Node.Element("File").Value,
                  };
用法:

    foreach(var Info in LoadInfo)
    {
      //Do something with the info.
      //Console.WriteLine(Info.Email);
    }

如果您知道这些属性,可以使用序列化来实现这一点

[XmlRoot("order")]
public class order
{
[XmlElement("Number")]
public string  Number{get;set;}
[XmlElement("Email")]
public string  Email{get;set;}
[XmlElement("Date")]
public string  Date{get;set;}
[XmlElement("File")]
public string[] File{get;set;}
}
下面的代码是要反序列化的

    public static T DeSerializeXMLString<T>(string xmlString)
    {
        XmlSerializer xs = new XmlSerializer(typeof(T));
        MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
        return (T)xs.Deserialize(memoryStream);
    }
public static T反序列化xmlString(string xmlString)
{
XmlSerializer xs=新的XmlSerializer(typeof(T));
MemoryStream MemoryStream=新的MemoryStream(StringToUTF8ByteArray(xmlString));
XmlTextWriter XmlTextWriter=新的XmlTextWriter(memoryStream,Encoding.UTF8);
返回(T)xs.反序列化(memoryStream);
}

您已经用“订单”完成了。您需要在“order”
foreach
循环中执行相同的
foreach
循环!哦,上帝。。。巨大的大脑让人失望。真尴尬。非常感谢。我觉得自己像个大傻瓜……@bang-我很想记下你的答案。。把它扔上去,这样我就能给你信誉。事实证明(自从我使用XML以来已经有一段时间了),我并没有完全遍历节点。。。忘了我的XPATH要点。使用近流怎么样/writer@GSerjo你能详细解释一下你的评论吗。我不明白。在这里使用(var memoryStream=newmemorystream(StringToUTF8ByteArray(xmlString)){…}得到:)有关系吗。这只是一个演示如何处理场景的快速代码。
    public static T DeSerializeXMLString<T>(string xmlString)
    {
        XmlSerializer xs = new XmlSerializer(typeof(T));
        MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
        return (T)xs.Deserialize(memoryStream);
    }