C# XML:从XML中检索特定值
从下面的XML中,我想找到一个基于雇主的值C# XML:从XML中检索特定值,c#,xml,C#,Xml,从下面的XML中,我想找到一个基于雇主的值 <?xml version="1.0" encoding="UTF-8"?> <Document> <Details> <Employer>Taxes</Employer> <Adr> <Strt>Street</Strt> <Twn>Town</Twn
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<Details>
<Employer>Taxes</Employer>
<Adr>
<Strt>Street</Strt>
<Twn>Town</Twn>
</Adr>
</Details>
<DetailsAcct>
<Recd>
<Payroll>
<Id>9</Id>
</Payroll>
</Recd>
<br>
<xy>A</xy>
</br>
</DetailsAcct>
</Document>
但是它给了我一个无效的令牌
错误。
我缺少什么?错误是由于
[contains(…])
引起的,请注意,缺少右括号。由于您希望返回Employer
元素,因此无需在此处输入祖先::Employer
:
//w:Document//w:Employer[contains(., 'Taxes')]
如果发布的XML与实际XML的结构相似(名称空间除外),最好使用更具体的XPath,即避免使用昂贵的/
:
/w:Document/w:Details/w:Employer[contains(., 'Taxes')]
此错误是由于
[包含(…])
引起的,请注意,右括号丢失。由于您希望返回雇主
元素,因此不需要在此处输入祖先::雇主
:
//w:Document//w:Employer[contains(., 'Taxes')]
如果发布的XML与实际XML的结构相似(名称空间除外),最好使用更具体的XPath,即避免使用昂贵的/
:
/w:Document/w:Details/w:Employer[contains(., 'Taxes')]
另一种选择是使用
如果XML位于字符串中:
string xml = "<xml goes here>";
XDocument document = XDocument.Parse(xml);
XElement element = document.Descendants("Employer").First();
string value = element.Value;
如果需要,您还可以找到具有特定值的雇主元素:
XElement element = document.Descendants("Employer").First(e => e.Value == "Taxes");
注意:如果找不到具有指定值的元素,这将引发异常。如果不可接受,则可以将.First(…)替换为.FirstOrDefault(…),如果找不到元素,它只会返回null。另一种方法是使用
如果XML位于字符串中:
string xml = "<xml goes here>";
XDocument document = XDocument.Parse(xml);
XElement element = document.Descendants("Employer").First();
string value = element.Value;
如果需要,您还可以找到具有特定值的雇主元素:
XElement element = document.Descendants("Employer").First(e => e.Value == "Taxes");
注意:如果找不到具有指定值的元素,这将引发异常。如果不可接受,则可以将.First(…)替换为.FirstOrDefault(…)如果找不到元素,它只会返回null。您想要的输出是什么?想要取回名为taxes的雇主当您的XML不在命名空间中时,您为什么使用
w:
命名空间前缀?您想要的输出是什么?想要取回名为taxes的雇主您为什么使用w:
当您的XML不在名称空间中时,名称空间前缀?全部为true,但您可能还想质疑在XML中未使用名称空间的情况下使用名称空间前缀(w:
)的问题。在XML中有许多节点。我需要检索包含“Taxes”的特定节点尝试了以下/w:Document/w:Details/w:Employer[contains(,'Taxes')]/祖先::Employer,nsmgr但返回“null”@vickyw:Employer[contains(,,'Taxes')]
已经涵盖了这一点,现在不需要祖先::Employer
@vicky,我无法正确地“猜测”情况(建议的XPath对实际的XML不起作用),我建议发布最小但完整的XML示例,演示上述XPath是如何失败的,即返回null
。确保人们可以轻松地复制粘贴XML并根据代码/XPathAll true对其进行测试,但您可能还想质疑名称空间前缀的使用(w:
)在XML中没有使用名称空间。在XML中有许多节点。我需要检索包含“Taxes”的特定节点。尝试了以下操作/w:Document/w:Details/w:Employer[contains(,'Taxes')]/祖先::Employer,nsmgr,但返回“null”@vickyw:Employer[contains(,'Taxes')]
已经涵盖了这一点,没有必要使用祖先::雇主
@vicky Now,因为我没有正确地“猜测”情况(XPath建议对实际的XML不起作用),我建议发布最小但完整的XML示例,演示上述XPath如何失败,即返回null
。确保人们可以轻松地复制粘贴XML并根据代码/XPath测试它