2016-09-24 61 views
1

我需要根據另一個節點值滿足的條件來獲取節點值。根據C#中的某些條件選擇xml節點及其'子節點的值'

這就是我正在尋找通過XML例子:

<Elements> 
<Element> 
    <ElementID>A1</ElementID> 
    <ElementName>Element A</ElementName> 
    <ElementValues> 
     <ElementValue> 
      <ValueText>A Value</ValueText> 
      <ValueDescription>A Type Element</ValueDescription> 
     </ElementValue> 
    </ElementValues> 
</Element> 
<Element> 
    <ElementID>B1</ElementID> 
    <ElementName>Element B</ElementName> 
    <ElementValues> 
     <ElementValue> 
      <ValueText>B Value</ValueText> 
      <ValueDescription>B Type Element</ValueDescription> 
     </ElementValue> 
    </ElementValues> 
</Element> 
</Elements> 

我需要從某些ElementID節點從ValueText標籤的標籤值。例如:如果搜索條件是「A1」,那麼結果應該是「A值」。 (類似於:獲得ValueText.Value,如果ElementID =「A1」) 請幫我解決這個問題(Linq,XPath,無論什麼......),我只是旋轉在圈子裏,無處可去。

在此先感謝!

我真的已經尋找答案,但不能得到類似的一個...

回答

0

如果我是正確的,你可以使用XPath表達式

//Element[ElementID/text() = \"B1\"] 

它將爲每一個搜索<Element>節點,並選擇具有<ElementID>子節點的子節點,該子節點還具有屬性text()(內部文本)的值爲B1。您可以將「B1」修改爲「A1」,您將得到另一個節點,在插入用戶輸入時只需謹慎,您不希望它們能夠修改完整的XPath表達式,這可能會導致漏洞。

下面是一個示例程序。

public static void Main(string[] args) 
    { 
     string xml = @"<Elements> 
        <Element> 
         <ElementID>A1</ElementID> 
         <ElementName>Element A</ElementName> 
         <ElementValues> 
          <ElementValue> 
           <ValueText>A Value</ValueText> 
           <ValueDescription>A Type Element</ValueDescription> 
          </ElementValue> 
         </ElementValues> 
        </Element> 
        <Element> 
         <ElementID>B1</ElementID> 
         <ElementName>Element B</ElementName> 
         <ElementValues> 
          <ElementValue> 
           <ValueText>B Value</ValueText> 
           <ValueDescription>B Type Element</ValueDescription> 
          </ElementValue> 
         </ElementValues> 
        </Element> 
        </Elements>"; 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xml); 
     XmlNode root = doc.DocumentElement; 

     /* Select all "<Element>" nodes which have an <ElementID> subnode where the text equals "B1". */ 
     var nodes = root.SelectNodes("//Element[ElementID/text() = \"B1\"]"); 

     foreach(XmlNode node in nodes){ 
      Console.WriteLine("Found matching Element: \n {0}", node.InnerXml); 
     } 
    }   

輸出

Found matching Element: 
<ElementID>B1</ElementID><ElementName>Element B</ElementName><ElementValues><ElementValue><ValueText>B Value</ValueText><ValueDescription>B Type Element</ValueDescription></ElementValue></ElementValues> 
0

下面是一個簡單的LINQ查詢:

string xml = ...; 
var root = XElement.Parse(xml); 
string elementID = "A1"; 
var result = root.Elements("Element") 
    .Where(e => e.Element("ElementID").Value == elementID) 
    .Select(e => e.Element("ElementValues").Element("ElementValue").Element("ValueText").Value) 
    .FirstOrDefault(); 
0

XML和LINQ合作,XML提供了使用XML的面向對象的方法。例如,當最初分析XML時,整個XML結構是對象,即根。當選擇節點時,每個節點變成它自己的對象。從你的例子,假設你已經有了XML是一個字符串(可以是文件或流,等等):

var doc = XDocument.Parse(xml); 

// retrieve the parent node of A1 
XElement a1 = doc.Root.Elements("Element") 
         .First(x => x.Element("ElementID").Value == "A1"); 

// a1 now has an XML structure of: 
// <Element> 
// <ElementID>A1</ElementID> 
// <ElementName>Element A</ElementName> 
// <ElementValues> 
//  <ElementValue> 
//  <ValueText>A Value</ValueText> 
//  <ValueDescription>A Type Element</ValueDescription> 
//  </ElementValue> 
// </ElementValues> 
// </Element> 

// get the value of ValueText w/ a verbose path: 
string verbosePath = a1.Element("ElementValues") 
         .Element("ElementValue") 
         .Element("ValueText").Value; 

// alternatively, short-circuit the path: 
string shortPath = a1.Descendants("ValueText").First().Value; 
0

完成與LINQ,你想要的值文本的元素ID替換elementId

var xDoc = XDocument.Parse(xml); 
var elements = xDoc.Element("Elements"); 
var element = elements.Elements("Element").Single(e => e.Element("ElementID").Value.Equals(elementId)); 
var valueText = element.Descendants("ValueText").Single().Value;