使用Linq-To-XML将子元素添加到XML

时间:2018-02-20 16:03:31

标签: c# xml linq-to-xml

以下是如何创建XML(使用.Net 4.7):

    public XElement ConstructHvtPayload(PayPageRequest ppRequest)
    {
        XNamespace xNamespace = "http://www.litle.com/schema";

        var request = 
            new XElement(xNamespace + "litleRequest",
                new XAttribute("version", "9.13"),
                new XAttribute("xmlns", "http://www.litle.com/schema"),
                new XAttribute("id", OrderId), 
                new XAttribute("numBatchRequests", "1"),
                new XElement(xNamespace + "authentication",
                    new XElement(xNamespace + "user", "testuser"),
                    new XElement(xNamespace + "password", "winteriscoming")),
                new XElement(xNamespace + "batchRequest",
                    new XAttribute("id", OrderId), 
                    new XAttribute("numTokenRegistrations", "1"),
                    new XAttribute("merchantId", MerchantId),
                        new XElement(xNamespace + "registerTokenRequest" ,
                        new XAttribute("id", OrderId), right?
                        new XAttribute("reportGroup", MerchantId),
                        new XElement(xNamespace + "orderId", ppRequest.OrderId),
                        new XElement(xNamespace + "accountNumber", ppRequest.AccountNumber)
                    )));



        return request;

    }

我想要做的是在返回之前添加一个If语句,以便在满足特定条件时插入新元素“cardValidationNumber”。

我尝试了以下(以及其他类似选项):

request.Element("batchRequest").Element("tokenRequest").Add(new XElement(xNamespace + "cardValidationNum", "CCV"));

我正在获取Object实例未设置错误。我也尝试了以下格式:

request.Root ......(但Root不作为选项提供)

我错过了什么?我怀疑从当前的回复中可能与我正在使用的自定义命名空间有关吗?

感谢。

3 个答案:

答案 0 :(得分:0)

如果不知道“请求”的来源,很难确定您收到错误的原因。 假设request是XDocument本身,它应该看起来像这样

request.Element("littleRequest").Element("batchRequest").Element("tokenRequest").Add(new XElement("ccv", "NEW ELEMENT & VALUE HERE"));

答案 1 :(得分:0)

尝试这样(使用XPath而不是LINQ to XML)

string path = @"D:\testing.xml";
            XmlDocument doc = new XmlDocument();
            doc.Load(path);
            string item = "abcxyz"; 
            XmlElement el = (XmlElement)doc.SelectSingleNode("//tokenRequest");

            if (el != null)
            {
                XmlElement elem = doc.CreateElement("CCV"); 
                elem.InnerText = item;
                el.AppendChild(elem);
            }

            doc.Save(path);

答案 2 :(得分:0)

试试这个:

var doc = XElement.Parse("<littleRequest><authentication><user>USER NAME HERE</user><password>PASSWORD HERE</password></authentication><batchRequest><tokenRequest><orderId>ORDER ID VALUE</orderId><accountNumber>accountNumberHERE</accountNumber></tokenRequest></batchRequest></littleRequest>");
var tokenRequest = doc.Descendants("tokenRequest").FirstOrDefault();
tokenRequest?.Add(new XElement("ccv", "NEW ELEMENT & VALUE HERE"));

string xml = doc.ToString();

它对我有用。