LINQ到XML,带条件和c#的可变XML结构
本文关键字:XML 结构 条件 LINQ | 更新日期: 2023-09-27 18:02:34
我有一个大问题,刚刚浪费了5个小时。我必须创建一个XML文件,该文件将由数据库reg填充。我有可变结构,在某些情况下会使用特定的子结构。
逻辑很简单。
我必须得到所有的代理,然后在每个机构我都要重复一个周期,把他们想卖/租的房子都找出来。但它不仅仅是房子,还有公寓、车库等等。每个场景都有自己的结构和不同的数据。
这不是全部,必须有一个条件。只在需要时才写入xml子节点。
一段XML示例
<Clients>
<Client>
<aggregator/>
<code/>
<reference/>
<contact>
<secondhandListing>
<property>
<code/>
<reference/>
<scope/>
<address>
<features/>
<operation> // variable structure
1example <price/>
<communityCosts/>
2example <price/>
<communityCosts/>
<depositType/>
</operation>
</property>
</secondhandListing>
谁能给我举个例子说明一下这是怎么做的?到目前为止我归档的是:
var agenciasConectores = //query of Agencys
foreach (var agenciaConector in agenciasConectores)
{
var imoveisAgencia = // query of homes in each Agency
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("Clients",
from agencia in agenciasConectores
select new XElement("Client", new XAttribute("ID", agencia.AgencyId),
new XElement("aggregator", agencia.ConnectorLicense),
new XElement("code", agencia.Name),
new XElement("Reference", agencia.Phone),
new XElement("contact", agencia.Phone),
new XElement("secondhandListing"),
new XElement("newbuildListing")
)));
foreach (var imovel in imoveisAgencia)
{
if (imoveisAgencia.Count() > 1)
{
doc.Document.Add(new XElement("property",
new XElement("code", "codigo"),
new XElement("reference", "reference"),
new XElement("scope", "scope"),
new XElement("address", "address"),
new XElement("contact", "contact"),
new XElement("features", "features"),
new XElement("operation", "operation"),
new XElement("description", "description")));
}
}
}
当我尝试在Visual Studio中运行此代码时,下面这行会抛出一个异常
doc.Document.Add(new XElement("property",
...
你想做更多这样的事情吗?
doc.Root.Add(new XElement("property",
...
或者更接近于
doc.Descendants("Client")
.Single(c => c.code == "something")
.Add(new XElement("property",
...
已经找到解决办法了
其简单。XElement root = new XElement("root");
XElement child = new XElement("Child");
XElement child2 = new XElement(Child2);
然后填充元素
Child.SetValue(a);
child2.Setvalue(b);
和在最后,我只是添加元素到父元素。
root.add(Child,Child2);
但是像这样,我也可以做一些验证(在我的例子中是循环)
If(a>b)
root.add(child);
else
root.add(child2);
谢谢你的尝试。我是通过例子来学习的嘿嘿