在将第三个节点返回到数据列表之前,分析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解析器
使用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;
}