XML拼图 - 为什么null元素?

时间:2015-05-27 16:04:25

标签: c# xml

任何人都可以告诉我为什么,给出以下XDocument内容

<AddOrderResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <ErrorMessage xmlns="http://schemas.datacontract.org/2004/07/appulsive.Intertek.LIMSService">, Fehler in der Belegerfassung Verkauf
Die Kontokorrentdaten konnten nicht gelesen werden.
(Exception of type 'Sagede.OfficeLine.Wawi.BelegEngine.RecordsetEmptyException' was thrown.)</ErrorMessage>
</AddOrderResult>

以及以下C#代码

    var resultElement =xmlResponse.Element("AddOrderResult");
    var errorMessage = resultElement.Element("ErrorMessage");

其中 xmlResponse 是有问题的XDocument对象, resultElement 是有效的XElement,但 errorMessage 始终为null?例如,它与ErrorMessage命名空间有关吗?

TIA。

1 个答案:

答案 0 :(得分:3)

您错过了ErrorMessage的命名空间 - 它与根XMLNS不同,需要指定。此代码将正确地获取您的元素:

string rawXmlString = @"<AddOrderResult xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">
  <ErrorMessage xmlns=""http://schemas.datacontract.org/2004/07/appulsive.Intertek.LIMSService"">, Fehler in der Belegerfassung Verkauf
Die Kontokorrentdaten konnten nicht gelesen werden.
(Exception of type 'Sagede.OfficeLine.Wawi.BelegEngine.RecordsetEmptyException' was thrown.)
  </ErrorMessage>
</AddOrderResult>";

XDocument xmlResponse = XDocument.Parse(rawXmlString);

var resultElement =xmlResponse.Element("AddOrderResult");
XNamespace ns = "http://schemas.datacontract.org/2004/07/appulsive.Intertek.LIMSService";
var errorMessage = resultElement.Element(ns + "ErrorMessage");

你也可以在没有命名空间的情况下获得它,但它更笨拙......

var errorMessage_NoNS = resultElement.Elements().Where(x => x.Name.LocalName == "ErrorMessage").FirstOrDefault();