2013-02-19 180 views
1

我在调用一个API,并且必须在C#中用不同节点中的数据发送一个xml请求。如何动态地创建xml并使用增量命名的节点。动态创建XML节点

例如

<?xml version="1.0" encoding="UTF-8" ?> 
<addCustomer> 
    <FirstName_1>ABC</FirstName_1> 
    <LastName_1>DEF</LastName_1> 
    <FirstName_2>GSH</FirstName_2> 
    <LastName_2>ADSF</LastName_2> 
</addCustomer> 

的问题是使XML节点与像FirstName_1,FirstName_2,FirstName_3等增加的名字。

+0

只是好奇,为什么你必须这样做? – 2013-02-19 17:11:51

+0

这是一个可怕的惯例。如果可以,请尝试更改XML的结构。无论如何,你的问题的答案是使用XML库,比如LINQ to XML。 – svick 2013-02-19 17:14:28

+0

我明白这不是正确的方法,但我们正在整合第三方API,并且他们要求我们在这个约定中发送数据。节点号码可以增加到200像FirstName_1到FirstName_200 – khurram 2013-02-19 17:19:06

回答

0

我认为最简单的解决办法是最好的位置:

假设你有一个名为客户客户对象的集合......

StringBuilder xmlForApi = new StringBuilder(); 
int customerCounter = 1; 
foreach(Customer c in Customers) 
{ 
    xmlForApi.AppendFormat("<FirstName_{0}>{1}</FirstName_{0}><LastName_{0}>{2}</LastName_{0}>", customerCounter, c.FirstName, c.LastName) 
    customerCounter++; 
} 
+1

我只想指出,如果您要添加名称'Mi | gunr2171 2013-02-26 18:49:19

+0

@ gunr2171。你100%正确。我讨厌失去声誉,但考虑到你的意见,你的答案应该是公认的。我会继续做下一个最好的事情,并提出你的答案。 – 2013-02-26 19:02:20

2

客户是否有多个FirstName和多个LastName?如果每个名字和姓氏对代表不同的客户,然后你的XML应该是这个样子....

<?xml version="1.0" encoding="UTF-8" ?> 
<AddCustomers> 
    <Customer> 
      <FirstName>ABC</FirstName> 
      <LastName>DEF</LastName> 
    </Customer> 
    <Customer> 
      <FirstName>GSH</FirstName> 
      <LastName>ASDF</LastName> 
    </Customer> 
</AddCustomers> 

如果你绝对要做到这一点,你这样做是在您的示例的方式,我没有看到任何方法来做到这一点,除了只使用string_builder并在for循环中自己创建它,同时递增整数以添加到每个First和Last属性的末尾。这不是真正的xml应该如何工作。

+0

XmlWriter会做的很好,如果ABC包含一个XML结构,如'<'或'&',最终得到的XML无效......严重的是,不要使用stringbuilder来创建XML。 – atlaste 2013-02-19 19:02:23

2

我知道你的痛苦;不得不处理第三方API可能会很痛苦。

而不是使用StringBuilder您可以使用XElement

public void AddCustomerInfo(string firstName, string lastName, int index, XElement root) 
{ 
    XElement firstNameInfo = new XElement("FirstName_" + index); 
    firstNameInfo.Value = firstName; 

    XElement lastNameInfo = new XElement("LastName_" + index); 
    lastNameInfo.Value = lastName; 

    root.Add(firstNameInfo); 
    root.Add(lastNameInfo); 
} 

然后调用该函数如下所示:

XElement rootElement = new XElement("addCustomer"); 
AddCustomerInfo("ABC", "DEF", 1, rootElement); 

把该行一环内,你所有的设置。

+0

看到OP正在创建“非标准”XML,我不确定使用XElement的开销是否会给OP带来任何好处。 – 2013-02-19 18:01:56

+0

虽然我同意它是非标准的,但它仍然是合法的XML。可以选择使用内存中的XML构建或StringBuilder。答案是“是值得的吗?” – gunr2171 2013-02-19 18:04:00

+0

对于纯粹的学术目的,我想知道哪个会使用最少的资源? – 2013-02-19 18:05:54