0

我在 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')])");

谢谢你的时间

4

1 回答 1

1

抛弃旧的 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;
}
于 2013-07-01T17:46:32.040 回答