我有这段代码:
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等,但它总是给出相同的错误..
为什么?
答案 0 :(得分:2)
因为Element
方法返回null:
xmlDoc.Element("PtmInf").Add(el)
然后在其上调用Add
,因此抛出异常。 Element
获得xmlDoc
的第一个子项(其中只有一个),并按元素名PtmInf
对其进行过滤。文档中的根元素是CBIBdyPaymentRequest
,其名称空间为urn:CBI:xsd:CBIBdyPaymentRequest.00.03.09
,因此没有匹配项。您也错误输入PtmInf
而不是PmtInf
。
你可能想要的是:
xmlDoc.Descendants(ns1 + "PmtInf").Single().Add(el)
答案 1 :(得分:0)
您还可以在搜索中忽略命名空间:
xmlDoc.Elements()。其中(e => e.Name.LocalName ==“PmtInf”);