在将第三个节点返回到数据列表之前,分析XML文件以检查2个子节点

本文关键字:分析 XML 文件 子节点 2个 检查 列表 数据 返回 节点 三个 | 更新日期: 2023-09-27 18:20:31

我使用C#中的ASP.net编码。我正在尝试读入一个XML文件,然后检查其中两个子节点,以确保它们符合标准。如果是这样,那么我将尝试返回属于同一父节点的其他子节点的文本。

示例XML:

<JobList>
    <Job>
        <JobTitle>Job 1</JobTitle>
        <ReqId>1234</ReqId>
        <filter1>
            <label>location</label>
            <value>texas</value>
        </filter1>
        <filter2>
            <label>type</label>
            <value>admin</value>
        </filter2>
    </Job>
</JobList>

当filter1/value=texas和filter2/value=admin时,我希望数据列表显示JobTitle和ReqId。我可以用下面的代码写一个位置列表,但我无法确定如何在2个条件下进行选择,然后使用该匹配的父项来获得不同的子项以提供给数据列表。这是我的最新版本:

XPathNavigator nav;
XPathDocument docNav;
XPathNodeIterator NodeIter;   
String xmlpath = "test.xml";      
docNav = new XPathDocument(xmlpath);
nav = docNav.CreateNavigator();
NodeIter = nav.Select("/JobList/Job/filter1/value[contains(.,'texas')]");
StreamWriter stw = File.AppendText("C:''test.txt");
while (NodeIter.MoveNext())
{
    NodeIter.Current.MoveToParent();
    //NodeIter.Current.MoveToParent();
    NodeIter.Current.MoveToChild("JobTitle",xmlpath);
    stw.WriteLine("Job Title: {0}", NodeIter.Current.Value);
 };
 stw.Close();

我试过这个,但它不起作用:

NodeIter = nav.Select("(/Job-Listing/Job/filter1/value[contains(.,'texas')]) and (/Job-Listing/Job/filter3/value[contains(.,'admin')])");

感谢您抽出时间

在将第三个节点返回到数据列表之前,分析XML文件以检查2个子节点

抛弃旧的xml解析器

使用LINQ2XML。这是一个简单而酷的

XElement doc=XElement.Load("yourXml.xml");
var lst=doc.Elements("Job")
                 .Where(x=>x.Element("filter1").Element("value").Value=="texas" &&
                          x.Element("filter2").Element("value").Value=="admin")
                 .Select(y=>
                            new
                            {
                               title=y.Element("JobTitle").Value,
                                id=y.Element("ReqId").Value
                            })
                 .ToList();

现在您可以在lst 上进行迭代

foreach(var l in lst)
{
    l.title;
    l.id;
}