2014-08-28 92 views
0

我想添加两个过滤条件,我能够实现一个结果。如果我正在使用标签进行搜索(这里我被卡住了),我想获得结果。在c中使用相同的标签名称过滤条件相同的标签名称#

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> 

我得到以下RESU LT。

ABC PQR XYZ

满足我一个条件。

第二个条件是,如果您从<Term>标签搜索,那么它应该返回相同的结果。

<Term ConceptPreferredTermYN="Y" IsPermutedTermYN="N" LexicalTag="NON" PrintFlagYN="Y" RecordPreferredTermYN="Y"> 
      <String>abc</String> 
     </Term> 

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

回答

0

您可以创建一个XPath查询来寻找节点值,然后选择它的TermList祖先:

XmlNodeList xmlNodeList 
      = desc.SelectNodes("root//ConceptList/Concept/TermList/Term/String[text() = 'pqr']/ancestor::TermList/Term/String"); 

这应该给你你在找什么。

0

我不知道您希望如何实现第二个条件,但您可以使用<Term>字符串进行搜索,并使用XPath在同一个<TermList>父级中返回所有<Term>的字符串。例如XPath的给出serch主页术语 “ABC”(格式化的可读性):

/root 
/DescriptorRecord 
/ConceptList 
/Concept 
/TermList[Term/String='abc'] 
/Term 
/String 

以上的XPath将返回 “ABC”, “焊接工艺评定”,并给定的样本XML发布的 “XYZ” 字符串节点。

相关问题