![](/img/trans.png)
[英]C# delete XML node based off the inner text without knowing the parent nodes
[英]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.