LINQ to XML,带有C#的条件和变量XML结构

时间:2015-07-14 16:08:07

标签: c# xml linq data-structures linq-to-xml

我有一个很大的问题,就是失去了5个小时。 我必须创建一个XML文件,该文件将由数据库reg填充。 我有可变结构,在某些情况下会使用特定的子结构。

逻辑很简单。

我必须得到所有的机构,  然后在每个机构我必须迭代一个foreach循环,  并获得他们想要出售/出租的所有房屋。  但它不仅有房屋,还有公寓,车库等等。 每个场景都有自己的结构和不同的数据。

这不是全部,必须有条件。仅在应该使用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")));
        }

    }

}

2 个答案:

答案 0 :(得分:0)

当我尝试在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",
    ...

答案 1 :(得分:0)

已经找到了解决方案。

简单。

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);
试试看。我通过hehehhe

的例子来学习