从以下XML中,我想找到一个基于雇主的值。
<?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>
我申请的C#代码是
detail = root.SelectSingleNode($"//w:Document//w:Employer[contains(text(), 'Taxes']/ancestor::Employer",nsmgr);
但它给了我一个invalid token
错误。
我错过了什么?
答案 0 :(得分:3)
错误是由[contains(...]
引起的,注意缺少右括号。由于您想要返回Employer
元素,因此此处不需要ancestor::Employer
:
//w:Document//w:Employer[contains(., 'Taxes')]
如果发布的XML类似于实际XML的结构(命名空间除外),最好使用更具体的XPath,即避免使用昂贵的//
:
/w:Document/w:Details/w:Employer[contains(., 'Taxes')]
答案 1 :(得分:2)
另一种方法是使用LINQ to XML。
如果XML是字符串:
string xml = "<xml goes here>";
XDocument document = XDocument.Parse(xml);
XElement element = document.Descendants("Employer").First();
string value = element.Value;
如果XML位于.xml文件中:
XDocument document = XDocument.Load("xmlfile.xml");
XElement element = document.Descendants("Employer").First();
string value = element.Value;
您还可以找到具有特定价值的雇主元素,如果您需要的话:
XElement element = document.Descendants("Employer").First(e => e.Value == "Taxes");
注意:如果找不到具有指定值的元素,则会抛出异常。如果这是不可接受的,那么你可以用.FirstOrDefault(...)替换.First(...),如果没有找到元素,它将只返回null。