2017-07-26 9 views
0

私は、一連のXPath文を文字列として格納し、XMLDocument(または他のC#XML構造)と比較して評価するC#プログラムを作成しています)、結果の値を辞書/オブジェクトに格納します。C#XmlDocumentに対して複数のXpathを評価する

私の挑戦は、私のXPathsが評価できないということです。非常に簡単な例として

、これは私のXMLであると仮定します

<root> 
    <a> 
     <child1 Id="Id1" Name="Name1" /> 
     <child2 Id="Id2" Name="Name2" /> 
    </a> 
</root> 

と、例えば、私のXPathの一つは次のとおりです。

//a/*[@Id='Id1']/name() 

aの子の名前を取得します。要素はId属性= "Id1")

これを行うために作成しようとしているコードの簡略化されたバージョンは次のようになります。

var xpath = @"//a/*[@Id='Id1']/name()"; 
var xml = @"<root><a><child1 Id='Id1' Name='Name1' /><child2 Id='Id2' Name='Name2' /></a></root>"; 

var doc = new XmlDocument(); 
doc.LoadXml(xml); 
var navigator = doc.CreateNavigator(); 

string ChildName = (string)navigator.Evaluate(xpath); 

私のXPathには無効なトークンがあるというエラーが表示されています。これはname()部分と仮定しています。

ツリーをトラバースするのではなく、直接XPathステートメントを使用してこれを行う方法はありますか?

ありがとうございます!

答えて

4

正しく理解していれば、XPathを再配置するだけで十分です。これを試してみてください:

name(//a/*[@Id='Id1']) 
+0

を! *ありがとうございました*!!! 大きな問題は、XmlDocumentとNavigatorを使用するというアイデアが正しい方法であるかどうかです。この場合、これが適切な解決策であれば、あなたはどんな考えを持っていますか? –

+1

@JohnBus​​tos XmlDocumentとナビゲータを使用すると、このようなXPath文だけを評価する予定がある限り、上手く行くことができます。私は通常、ほとんどの.NET XMLの目的にLINQ to XMLを推奨しています(XPathはLINQ to XMLでXPathSelectElementsメソッドを使って実行できます)。もっとたくさんのXML操作を行うことが予想される場合は、それに切り替えることをお勧めします。 – DevNoob

+0

ありがとうございました!!!! –

0

のxml liinqの使用:作品

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication68 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml = "<root>" + 
          "<a>" + 
           "<child1 Id=\"Id1\" Name=\"Name1\" />" + 
           "<child2 Id=\"Id2\" Name=\"Name2\" />" + 
          "</a>" + 
         "</root>"; 

      XDocument doc = XDocument.Parse(xml); 

      Dictionary<string, string> dict = doc.Descendants("a").FirstOrDefault().Elements().Where(x => x.Name.LocalName.StartsWith("child")) 
       .GroupBy(x => (string)x.Attribute("Id"), y => (string)y.Attribute("Name")) 
       .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 

     } 
    } 


} 
+0

残念ながら、これは各値のコーディングを必要とするでしょう - 私はテキストXPathsを格納するような一般的な解決策を探していました。あなたはそれについてのアイデアはありますか?コードをありがとう、そうでなければ、しかし。 –

+0

サンプルデータがなくても答えは出せません。私はできるだけジェネリックにしようとしましたが、あなたは "各価値"によって何を意味するのか分かりません。 – jdweng

関連する問題