【发布时间】:2020-06-04 22:50:52
【问题描述】:
我正在使用以 XML 格式提供响应的 Web 服务。发生错误时,XML 中的某处是属性 msg。问题是,根据请求,响应中的属性 msg 可以属于不同的元素。在一种情况下,attr 可以属于元素 Dimension,而在另一种情况下,可以属于元素 Period。 Dimension 是根元素,但 Period 是 Transaction 的子元素。
我看到的每个解决方案都假设您知道父元素的名称,在我的情况下可能会有所不同。
我需要的是代码来查找属性 msg 和 msgtype 所属的元素,以便在此基础上找到名称或发票编号等其余信息。
这是我的代码,可以在第一个 xml 示例中轻松找到 msg,但在第二个示例中找不到。
XDocument xml = XDocument.Load(@"C:\Temp\Response.xml");
string element = xml.Root.Name.ToString(), text = "", msg = "", naam = "";
var nodes = (from n in xml.Descendants(element)
where n.Attribute("msgtype").Value == "error"
select new
{
naam = n.Element("name")
, msg = n.Attribute("msg")
}).ToList();
foreach (var n in nodes)
{
text += n.msg.ToString();
Response.Write(text);
}
第一个 XML
<dimension msgtype="error" msg="De code voldoet niet aan het formaat 1[0-9][0-9][0-9]." result="0">
<office>ZKF000324</office>
<type>DEB</type>
<code>14</code>
<name>Bedrijf 113</name>
<shortname>Bedrijf 113</shortname>
</dimension>
第二个 XML
<transaction result="0" destiny="temporary">
<header result="0">
<office shortname="Twinfield" name="Pietersen">ZKF000324</office>
<code shortname="Verkoop" name="Verkoopfactuur">VRK</code>
<currency shortname="EuroK" name="Euro naam">EUR</currency>
<period result="0" msg="Jaar 2020 moet tussen 1965 en 2019 liggen.//Jaar 2020 moet tussen 1965 en 2019 liggen.//Jaar 2020 moet tussen 1965 en 2019 liggen.//De combinatie van het jaar en de periode bestaat niet." msgtype="error">2020/05</period>
<date result="0" msg="Datum 12/05/2020 valt buiten de opgegeven periode (2020/05)." msgtype="warning">20200512</date>
<invoicenumber>2016112</invoicenumber>
</transaction>
【问题讨论】: