过滤xml中具有相同c#标记名称的条件
本文关键字:条件 xml 过滤 | 更新日期: 2023-09-27 18:19:41
我想添加两个过滤条件,并且我能够获得一个结果。如果我用标签进行搜索,我想得到结果(这里我被卡住了)。
XML文件
<root>
<DescriptorRecord DescriptorClass = "1">
<DescriptorName>
<String>abc</String>
</DescriptorName>
<ConceptList>
<Concept PreferredConceptYN="Y">
<TermList>
<Term ConceptPreferredTermYN="Y" IsPermutedTermYN="N" LexicalTag="NON" PrintFlagYN="Y" RecordPreferredTermYN="Y">
<String>abc</String>
</Term>
<Term ConceptPreferredTermYN="N" IsPermutedTermYN="N" LexicalTag="NON" PrintFlagYN="N" RecordPreferredTermYN="N">
<String>pqr</String>
</Term>
<Term ConceptPreferredTermYN="N" IsPermutedTermYN="N" LexicalTag="NON" PrintFlagYN="Y" RecordPreferredTermYN="N">
<String>xyz</String>
</Term>
</TermList>
</Concept>
</ConceptList>
</DescriptorRecord>
<DescriptorRecord DescriptorClass = "1">
<DescriptorName>
<String>123</String>
</DescriptorName>
<ConceptList>
<Concept PreferredConceptYN="Y">
<TermList>
<Term ConceptPreferredTermYN="Y" IsPermutedTermYN="N" LexicalTag="NON" PrintFlagYN="Y" RecordPreferredTermYN="Y">
<String>123</String>
</Term>
<Term ConceptPreferredTermYN="N" IsPermutedTermYN="N" LexicalTag="NON" PrintFlagYN="N" RecordPreferredTermYN="N">
<String>456</String>
</Term>
<Term ConceptPreferredTermYN="N" IsPermutedTermYN="N" LexicalTag="NON" PrintFlagYN="Y" RecordPreferredTermYN="N">
<String>789</String>
</Term>
</TermList>
</Concept>
</ConceptList>
</DescriptorRecord>
</root>
C#代码
XmlDocument doc = new XmlDocument();
doc.Load(myXMLfile);
XmlNodeList descriptors = doc.SelectNodes("root/DescriptorRecord");
#region
foreach (XmlNode desc in descriptors)
{
if (desc != null && desc.HasChildNodes)
{
var node = desc.SelectSingleNode("DescriptorName/String");
if (node != null)
{
String descName = node.InnerText.ToLower().Replace(SPACE, string.Empty);
if (string.Equals(descName, lowerCaseGeneralTerm))
{
//Read a collection of nodes if your file have many <Term> nodes
XmlNodeList xmlNodeList = desc.SelectNodes("ConceptList/Concept/TermList/Term/String");
if (xmlNodeList != null)
{
foreach (XmlNode xmlNode in xmlNodeList)
{
conceptNames.Add(xmlNode.InnerText);
}
var result = conceptNames.Where(x => x.Replace(SPACE, string.Empty).Equals(lowerCaseGeneralTerm, StringComparison.InvariantCultureIgnoreCase));
if (result != null && result.Count() > 0)
{
//Seprate concepts with new line
String splitConceptWithComma = String.Join(Environment.NewLine, conceptNames.ToArray());
txtMeSHTerms.Text = splitConceptWithComma;
}
}
}
}
}
//Clear the list after displaying result so for next search it won't combine previous + current result.
conceptNames.Clear();
}
结果:
如果您从<DescriptorName>
标签中搜索"abc"
<DescriptorName>
<String>abc</String>
</DescriptorName>
我得到以下结果。
abcpqrxyz
这满足了我的一个条件。
第二个条件是,如果您从<Term>
标签进行搜索,那么它应该返回相同的结果。
<Term ConceptPreferredTermYN="Y" IsPermutedTermYN="N" LexicalTag="NON" PrintFlagYN="Y" RecordPreferredTermYN="Y">
<String>abc</String>
</Term>
我希望这些信息足够了。提前谢谢。
您可以创建一个XPath查询来查找节点值,然后选择它的TermList
祖先:
XmlNodeList xmlNodeList
= desc.SelectNodes("root//ConceptList/Concept/TermList/Term/String[text() = 'pqr']/ancestor::TermList/Term/String");
这应该会给你想要的东西。
我不知道您希望如何具体实现第二个条件,但您可以通过<Term>
字符串进行搜索,并使用XPath返回同一<TermList>
父级中的所有<Term>
字符串。给定serch术语"abc"的XPath示例(为可读性格式化):
/root
/DescriptorRecord
/ConceptList
/Concept
/TermList[Term/String='abc']
/Term
/String
上面的XPath将返回给定发布的示例XML的"abc"、"pqr"answers"xyz"字符串节点。