创建复杂的xml结构

时间:2015-04-09 20:29:58

标签: c# xml c#-3.0

我是一名只有1年经验的C#开发人员。我面临着为Web服务创建复杂xml请求的问题。

我收到了XSD文件&示例xml请求。现在我要使用正确的数据填充它并调用Web服务。 我在创建小型xml结构方面有一点经验。 我正在做的是使用字符串concatination / xml文档对象/ xml编写器。 这些方法适用于小型结构,但结构较大,使用上述对象模型编写每个标签并不容易。

请告诉我从C#创建复杂xml结构的最佳方法。感谢。

1 个答案:

答案 0 :(得分:1)

Linq to Xml是一种非常简洁的方式来表达来自linq查询的Xml。

以下是如何在LINQ to Xml中构建一个Xml树(来自Microsoft:https://msdn.microsoft.com/en-us/library/bb387089.aspx)。

XElement contacts =
new XElement("Contacts",
    new XElement("Contact",
        new XElement("Name", "Patrick Hines"), 
        new XElement("Phone", "206-555-0144"),
        new XElement("Address",
            new XElement("Street1", "123 Main St"),
            new XElement("City", "Mercer Island"),
            new XElement("State", "WA"),
            new XElement("Postal", "68042")
        )
    )
);

输出:

<Contacts>
  <Contact>
    <Name>Patrick Hines</Name>
    <Phone>206-555-0144</Phone>
    <Address>
      <Street1>123 Main St</Street1>
      <City>Mercer Island</City>
      <State>WA</State>
      <Postal>68042</Postal>
    </Address>
  </Contact>
</Contacts>

Joseph Albahari的伟大的c#bible C# 5.0 In a Nutshell有一些很好的例子,包括关于&#34; Linq to XML&#34;的章节。他的免费LinqPad应用程序附带了一些很好的例子,如下面第10章中的这些例子。

以下示例直接从Linq语句构建XML。您可以看到它比直接序列化更直接地控制输出XML,并简化了创建更复杂的XML结构。

// Query Example 1

IQueryable<XElement> sqlQuery =
from c in Customers
    select 
        new XElement ("customer", new XAttribute ("id", c.ID),
            new XElement ("name", c.Name),
            new XElement ("buys", c.Purchases.Count)
        );
var customers = new XElement ("customers", sqlQuery);



// Query Example 2

new XElement ("customers",
from c in Customers
    let lastBigBuy = (
        from p in c.Purchases
        where p.Price > 1000
        orderby p.Date descending
        select p
    ).FirstOrDefault()
    select 
    new XElement ("customer", new XAttribute ("id", c.ID),
        new XElement ("name", c.Name),
        new XElement ("buys", c.Purchases.Count),
        new XElement ("lastBigBuy",
            new XElement ("description",
                lastBigBuy == null ? null : lastBigBuy.Description),
            new XElement ("price",
                lastBigBuy == null ? 0m : lastBigBuy.Price)
            )
        )
    )