过滤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>

我希望这些信息足够了。提前谢谢。

过滤xml中具有相同c#标记名称的条件

您可以创建一个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"字符串节点。