繁体   English   中英

linq to xml将元素添加到节点

[英]linq to xml add element to node

我有以下代码:

XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
        XNamespace ns = XNamespace.Get("urn:CBI:xsd:CBIBdyPaymentRequest.00.03.09");
        XNamespace ns1 = XNamespace.Get("urn:CBI:xsd:CBIPaymentRequest.00.03.09");
        XDocument xmlDoc = new XDocument(
            new XElement(ns + "CBIBdyPaymentRequest",
            new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
            new XAttribute(xsi + "schemaLocation", "urn:CBI:xsd:CBIBdyPaymentRequest.00.03.09 CBIBdyPaymentRequest.00.03.09.xsd"),
                new XElement(ns +"CBIEnvelPaymentRequest",
                    new XElement(ns +"CBIPaymentRequest",
                        new XElement(ns1 + "GrpHdr",
                        new XElement(ns1 + "MsgId", txtNomeDistinta.Text),
                        new XElement(ns1 + "CreDtTm", dataCreazioneDistinta.ToString("o")),
                        new XElement(ns1 + "NbOfTxs", Convert.ToString(listAnagraficheXML.Count)),
                        new XElement(ns1 + "CtrlSum", getTotalXmlTransactions()),
                        new XElement(ns1 + "InitgPty",
                            new XElement(ns1 + "Nm", Properties.Settings.Default.ragioneSociale),
                            new XElement(ns1 + "Id",
                                new XElement(ns1 + "OrgId",
                                    new XElement(ns1 + "Othr",
                                        new XElement(ns1 + "Id", Properties.Settings.Default.codiceCuc),
                                        new XElement(ns1 + "Issr", "CBI")
                                        )
                                    )
                                )
                            )
                        ), //fine GrpHdr
                        new XElement(ns1 + "PmtInf",
                        new XElement(ns1 + "PmtInfId", txtNomeDistinta.Text),
                        new XElement(ns1 + "PmtMtd", "TRF"),
                            new XElement(ns1 + "PmtTpInf",
                                new XElement(ns1 + "InstrPrty", "NORM"),
                                new XElement(ns1 + "SvcLvl",
                                    new XElement(ns1 + "Cd", "SEPA")
                                )
                            ),                           
                            new XElement(ns1 + "ReqdExctnDt", dataCreazioneDistinta.ToString("yy-MM-dd")),
                            new XElement(ns1 + "Dbtr",
                                new XElement(ns1 + "Nm", Properties.Settings.Default.ragioneSociale),
                                new XElement(ns1 + "Id",
                                    new XElement(ns1 +"OrgId",
                                        new XElement(ns1 + "Othr",
                                            new XElement(ns1 + "Id", Properties.Settings.Default.codiceCuc),
                                            new XElement(ns1 + "Issr", "CBI")
                                        )
                                    )
                                )
                            ), //fine Dbtr
                            new XElement(ns1 + "DbtrAcct",
                                new XElement(ns1 + "Id",
                                    new XElement(ns1 + "IBAN", Properties.Settings.Default.iban)
                                )
                            ), // fine DbtrAcct
                            new XElement(ns1 + "DbtrAgt",
                                new XElement(ns1 + "FinInstnId",
                                    new XElement(ns1 + "ClrSysMmbId",
                                        new XElement(ns1 + "MmbId", Properties.Settings.Default.abi)
                                    )
                                )
                            ), // fine DbtrAgt
                            new XElement(ns1 + "ChrgBr", "SLEV")
                         ) //fine PtmInf
                    ) // CBIPaymentRequest
                ) // fine CBIEnvelPaymentRequest
            )  //fine CBIBdyPaymentRequest              
        );

如果我保存文档,效果很好,但是如果我想用此代码添加元素

var num_trn = 0;
        foreach (Anagrafica an in listAnagraficheXML)
        {
            num_trn++;
            XElement el = new XElement(ns1 + "CdtTrfTxInf",
                new XElement(ns1 + "PmtId",
                    new XElement(ns1 + "InstrId", num_trn),
                    new XElement(ns1 + "EndToEndId", txtNomeDistinta.Text + "-" + num_trn.ToString("D4"))
                ),
                new XElement(ns1 + "PmtTpInf",
                    new XElement(ns1 + "CtgyPurp",
                        new XElement(ns1 + "CD", checkForPurpose())
                    )
                ),
                new XElement(ns1 + "Amt",
                    new XElement(ns1 + "InstdAmt", new XAttribute("Ccy", "EUR"), getImportXmlTransaction(num_trn))
                ),
                new XElement(ns1 + "Cdtr",
                    new XElement(ns1 + "Nm", an.nome)
                ),
                new XElement(ns1 + "CdtrAcct",
                    new XElement(ns1 + "Id",
                        new XElement(ns1 + "IBAN", an.iban)
                    )
                ),
                new XElement(ns1 + "RmtInf",
                    new XElement(ns1 + "Ustrd", getCausalXmlTransaction(num_trn))
                )
            );
            xmlDoc.Element("PtmInf").Add(el);
        }

它在最后一行给出System.NullReferenceException。。我尝试使用Elements,getName等,但始终给出相同的错误。

为什么??

因为这里的Element方法返回null:

 xmlDoc.Element("PtmInf").Add(el)

然后,您对其调用Add ,因此将引发异常。 Element获取xmlDoc的第一PtmInf元素(其中只有一个),并按元素名称PtmInf对其进行过滤。 文档中的根元素是CBIBdyPaymentRequest ,其名称空间为urn:CBI:xsd:CBIBdyPaymentRequest.00.03.09 ,因此没有匹配项。 您还PtmInf而不是PmtInf

您可能想要的是:

 xmlDoc.Descendants(ns1 + "PmtInf").Single().Add(el)

您也可以在搜索中忽略名称空间:

xmlDoc.Elements()。Where(e => e.Name.LocalName ==“ PmtInf”);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM