[英]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.