繁体   English   中英

在不知道父级名称的情况下根据属性读取 XML 元素

[英]Read XML element based on attribute without knowing name of parent

我正在使用在 XML 中给出响应的 Web 服务。 发生错误时,XML 中的某处是属性 msg。 问题是,根据请求,响应中的属性 msg 可以属于不同的元素。 在一种情况下,attr 可以属于元素 Dimension,而在另一种情况下,可以属于元素 Period。 Dimension 是根元素,但 Period 是 Transaction 的子元素。

我看到的每个解决方案都假设您知道父元素的名称,在我的情况下可能会有所不同。

我需要的是找到属性msg和msgtype所属的元素的代码,这样我就可以找到名称或发票号等信息的rest。

这是我的代码,可以在第一个 xml 示例中轻松找到消息,但在第二个示例中找不到。

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>

您需要 go 穿过整个树: Descendants()

注意空条件运算符?.

var nodes = (from n in xml.Descendants()
             where n.Attribute("msgtype")?.Value == "error"
             select new
             {
                 msg = n.Attribute("msg")
             })
            .ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM