簡體   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