假设我们有以下XML文件,看起来像
<model uri="model1">
<PriceData>
<value price="24.28" date="2013-12-01"/>
<value price="22.34" date="2013-12-02"/>
<value price="24.12" date="2013-12-03"/>
</PriceData>
</model>
<model uri="model2">
<PriceData>
<value price="24.28" date="2013-12-01"/>
<value price="22.34" date="2013-12-02"/>
<value price="24.12" date="2013-12-03"/>
</PriceData>
</model>
这可以继续许多型号和价格。我搜索一种方法,在不同的列表(或数组)中解析每个模型的价格而不用手动,即预分配列表等,因为模型的数量不会一直相同。那么我怎样才能为不同型号制作价格“桶”呢?我到现在为止尝试的是
using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Collections.Generic;
namespace test
{
class Program
{
static void Main(string[] args)
{
string file = @"C:\Users\user\Desktop\test.xml";
XDocument doc = XDocument.Load(file);
List<string> priceData = new List<string>();
List<string> modelName = new List<string>();
foreach (var imovel in doc.Root.Descendants("model"))
{
modelName.Add(imovel.Attribute("uri").Value);
}
int modelNum = modelName.Count();
foreach (var item in doc.Descendants("value"))
{
var doubleAttr = item.Attribute("price");
if (doubleAttr == null) continue;
priceData.Add(item.Attribute("price").Value);
}
//Console.WriteLine(modelName[0]);
Console.ReadKey();
}
}
}
但在这种情况下,第二个foreach循环获取列表中所有模型的价格。我试着想出一些想法......我的咖啡是空的: - (
答案 0 :(得分:1)
尝试LINQ:
string file = @"C:\Users\user\Desktop\test.xml";
XDocument doc = XDocument.Load(file);
XDocument doc = XDocument.Parse(file);
var list = doc.Elements("model").Select(x => new {
Uri = x.Attribute("uri").Value,
Prices = x.Element("PriceData").Elements().Select(y => new {
Price = y.Attribute("price"),
Date = y.Attribute("date")
}).ToList()
}).ToList();
这是小提琴:http://dotnetfiddle.net/QbtKgo
但实际上这段代码可能与您的xml架构有所不同,但它显示了这种方法。
答案 1 :(得分:0)
所以我找到了一个解决方案,它给了我正在寻找的结果
string file = @"C:\Users\user\Desktop\test.xml";
string id = "model1"; /* here you can set a parse dialog*/
string ModelID = "//model[@uri='" + id + "']";
List<string> priceData = new List<string>();
XmlDocument xDoc = new XmlDocument();
xDoc.Load(file);
XmlNodeList PriceNodeList = xDoc.SelectNodes(ModelID + "/PriceData/value");
//looping through the all the node details one by one
foreach (XmlNode x in PriceNodeList)
{
//for the current Node retrieving all the Attributes details
var price = x.Attributes["double"];
if (price == null) continue;
priceData.Add(price.Value);
}