2017-07-26 94 views
0

我寫一個C#程序,我想存儲一系列的XPath語句作爲字符串,並評估它們針對XmlDocument(或其他一些C#XML結構是否有用於此目的的更好的)並將結果值存儲在字典/對象中。C#評估多個XPath的針對XmlDocument

我面臨的挑戰是,我的XPath不能夠進行評估。

作爲一個非常簡單的例子,假設這是我的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和導航的想法是正確的道路要走。如果在這種情況下這是正確的解決方案,您是否有任何想法? –

+1

@JohnBus​​tos使用的XmlDocument和導航是一個很好的方式,只要你打算只計算XPath語句像這樣去。我通常推薦LINQ to XML用於大多數.NET XML目的(您可以使用'XPathSelectElements'方法執行帶有LINQ to XML的XPath)。如果您預計會進行更多的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

不幸的是,這需要爲每個值編碼 - 我正在尋找一個通用的解決方案,比如存儲文本XPath。你有什麼想法嗎?儘管如此,感謝代碼,否則。 –

+0

如果沒有更多的樣本數據,我無法給出答案。我試圖儘可能通用,但不知道「每個值」是什麼意思。 – jdweng