我正在使用像这样的xml文件。
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<Element1>
<Element2 day="2009-10-18">
<Element3 name="Joe">
<Element4 time="1">
<Element5 amount="0" price="16.58"/>
<Element5 amount="1" price="18.58"/>
<Element5 amount="2" price="20.58"/>
</Element4>
</Element3>
<Element3 name="Fred">
<Element4 time="5">
<Element5 amount="1" price="15.41"/>
<Element5 amount="2" price="16.41"/>
<Element5 amount="3" price="17.41"/>
<Element5 amount="4" price="18.41"/>
</Element4>
</Element3>
</Element2>
</Element1>
</Body>
</Envelope>
我需要循环遍历所有Element3节点,然后遍历所有Element5节点以获得类似于此的输出。
day, name, time, amount, price
2009-10-18, Joe, 1, 0, 16.58
2009-10-18, Joe, 1, 1, 18.58
2009-10-18, Joe, 1, 2, 20.58
2009-10-18, Joe, 1, 1, 16.58
2009-10-18, Fred, 5, 0, 15.41
etc
我的linq查询执行此操作看起来像下面我认为很好,直到我意识到这只是抓住它来到的第一个Element5节点。
XDocument doc = XDocument.Load(@"myfile.xml");
DataContext st = new DataContext();
var docxml = from c in doc.Elements("Envelope").Elements("Body").Elements("Element1").Elements("Element2").Elements("Element3")
select new mytable()
{
MyKey = Guid.NewGuid(),
day = Convert.ToDateTime(c.Parent.Attribute("day").Value)
name = c.FirstAttribute.Value,
hour = Convert.ToInt32(c.Element("Element4").FirstAttribute.Value),
price = Convert.ToDecimal(c.Element("Element4").Element("Element5").Attribute("price").Value),
amount = Convert.ToDecimal(c.Element("Element4").Element("Element5").Attribute("amount").Value)
};
st.mytable.InsertAllOnSubmit(docxml);
st.SubmitChanges();
如何将其循环以包含所有Element5节点?
答案 0 :(得分:2)
每个语句基本上都是一个foreach循环(简单的思考方式) 注意:我必须更改一些父关系
XDocument doc = XDocument.Load(@"myfile.xml");
DataContext st = new DataContext();
var docxml = from c in doc.Elements("Envelope").Elements("Body").Elements("Element1").Elements("Element2").Elements("Element3").Elements("Element4")
from e in c.Elements("Element5")
select new mytable()
{
MyKey = Guid.NewGuid(),
day = Convert.ToDateTime(c.Parent.Parent.Attribute("day").Value)
name = c.Parent.FirstAttribute.Value,
hour = Convert.ToInt32(c.FirstAttribute.Value),
price = Convert.ToDecimal(e.Attribute("price").Value),
amount = Convert.ToDecimal(e.Attribute("amount").Value)
};
st.mytable.InsertAllOnSubmit(docxml);
st.SubmitChanges();
使用let-statement和更好的名称可以使代码更具可读性:
var docxml = from element4 in doc.Elements("Envelope").Elements("Body").Elements("Element1").Elements("Element2").Elements("Element3").Elements("Element4")
let element3 = element4.Parent
let element2 = element3.Parent
from element5 in c.Elements("Element5")
...
我无法测试代码,因为我在MacBook上。希望这会有所帮助。