2016-09-24 5 views
1

別のノード値が満たしている基準に基づいてノード値を取得する必要があります。私は特定の要素IDを持つノードからValueTextタグからタグ値が必要C#でいくつかの基準に基づいて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> 

これは私がスルー検索いXMLの例です。たとえば、検索条件が「A1」の場合、結果は「A値」になります。 (ElementID = "A1"の場合ValueText.Valueを取得する) 私はこの1つ(Linq、XPath、何でも...)を手伝ってください、私は円で回転してどこにもいません。

ありがとうございます!私は右だ場合

私は本当に答えで検索しましたが、同様のものを得ることができませんでした...

答えて

0

、あなたはXPath式

//Element[ElementID/text() = \"B1\"] 
を使用することができます それは、すべてを検索します

<Element>ノードをXML文書内に追加し、さらにtext()(内部テキスト)の値がB1であるというプロパティを持つ<ElementID>サブノードを持つ人を選択します。あなたは "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にXMLとLINQを使用した作業XMLを扱うのオブジェクト指向のアプローチを提供します。例えば、XMLが最初に解析されるとき、XML構造全体がオブジェクト、すなわちルートである。ノードを選択すると、各ノードはそれ自身のオブジェクトになります。あなたの例からは、すでにXMLが文字列(ファイル、またはストリーム、何でもすることができる)である必要があり仮定:

LINQで完了
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

、あなたがの値のテキストをしたい要素の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; 
関連する問題