我有一个C#.NET应用程序,其中包含动态生成的xml文档。它跟踪订单信息,例如名称,订单日期,所有类型的东西。我没有问题使用innerText提取这些标签中包含的信息。
但是,当订单生成时#39;我们的客户可以附加文件....
每个文件都保存在标签
下的xml doc中所以我最终得到了这样的东西(简化):
<order>
<Number>1</Number>
<Email>example@stack.com</Email>
<Date>2012-08-13</Date>
<File>File1.txt</File>
<File>File2.txt</File>
</order>
正如我所说,我使用
提取其他信息 foreach (XmlElement element in file.SelectNodes("/order"))
{
String strNumber = element.SelectSingleNode("Number").InnerText,
strEmail = element.SelectSingleNode("Email").InnerText,
strDate = element.SelectSingleNode("Date").InnerText;
}
然而,当我使用名字执行此操作时,我收到一个错误,因为没有设置为实例...我完全理解。
我的问题是,如何获取此信息?可以添加任意数量的文件,从零到用户想要的许多文件。
感谢您的时间。
答案 0 :(得分:1)
这是代码示例。
订单代表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; }
}
答案 1 :(得分:1)
如果您知道属性
,则可以使用序列化来执行此操作[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);
}
答案 2 :(得分:0)
这是基于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);
}