简体   繁体   中英

linq to xml add element to node

I have this code:

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

if I save the document it works well but if i want to add element with this code

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

it gives System.NullReferenceException on last line.. I tried with Elements, getName, etc but it gives always same error..

Why??

Because the Element method here returns null:

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

You then call Add on it, so the exception is thrown. Element gets the first children of xmlDoc (of which there is only ever one) and filters it by element name PtmInf . The root element in your document is CBIBdyPaymentRequest with namespace urn:CBI:xsd:CBIBdyPaymentRequest.00.03.09 , so there is no match. You've also mistyped PtmInf instead of PmtInf .

What you probably want is this:

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

Also you can ignore namespace in searching:

xmlDoc.Elements().Where(e => e.Name.LocalName == "PmtInf");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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