动态生成XML节点

本文关键字:节点 XML 动态 | 更新日期: 2023-09-27 18:00:19

我正在调用一个API,并且必须用C#发送一个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等。

动态生成XML节点

客户会有多个FirstName和多个LastName吗?如果每个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 name属性的末尾。xml实际上并不是这样工作的。

我知道你的痛苦;必须与第三方API打交道可能会带来很大的痛苦。

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

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);

把那条线放在一个圆圈里,你就做好了。

我认为最简单的解决方案是最好的:

假设您有一个名为Customers的Customer对象集合。。。

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++;
}