XML:从xml中检索特定值

时间:2016-05-05 21:40:22

标签: c# xml

从以下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错误。 我错过了什么?

2 个答案:

答案 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。