2014-08-28 98 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」 字符串節點。

相關問題