【问题标题】:Adding Child Element to XML using Linq-To-XML使用 Linq-To-XML 将子元素添加到 XML
【发布时间】:2018-02-20 16:03:30
【问题描述】:

以下是创建 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 instance not set 错误。我也尝试过以下格式:

request.Root......(但 Root 不可作为选项)

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

谢谢。

【问题讨论】:

  • XElement tokenRequest = doc.Descendants("tokenRequest").FirstOrDefault(); tokenRequest.Add(new XElement("ccv", new XElement("newElement","value")));
  • XElement tokenRequest = doc.Descendants("tokenRequest").FirstOrDefault();返回为空...这是我的问题
  • 文件中是否有命名空间。试试 XElement tokenRequest = doc.Descendants().Where(x => x.Name.LocalName == "tokenRequest").FirstOrDefault();
  • 是的,我正在使用自定义命名空间。这在构建它时会导致其他问题。
  • 没有看到实际的命名空间,我无法给出更好的答案。您可以使用以下方法从我的结果中获取命名空间:XNamespace ns = tokenRequest.GetDefaultNamespace();

标签: c# xml linq-to-xml


【解决方案1】:

在不知道“请求”来自何处的情况下,很难确定您收到错误的原因。 假设请求是 XDocument 本身,它应该是这样的

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

【讨论】:

  • 另外,我不知道您提出问题时是否是错字,但原始 XML 中的“tokenRequest”周围不应有任何空格。这会出错。
  • 这是一个错字 - 试图清理数据 - 谢谢!
【解决方案2】:

试试这个:

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

它对我有用。

【讨论】:

    【解决方案3】:

    尝试这样(虽然使用 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);
    

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多