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.