2013-10-17 77 views
0

我想從Entity Framework中讀取EDMX文件中的實體集。XPath不能正常工作

的EDMX文件(XML格式),具有以下佈局:

<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx"> 
    <edmx:Runtime> 
     <edmx:ConceptualModels> 
     <Schema Namespace="Model" Alias="Self" p1:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:p1="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm"> 
       <EntityContainer Name="EntityModel" p1:LazyLoadingEnabled="true"> 
        <EntitySet Name="TableName" EntityType="Model.TableName" /> 

我使用以下XPath獲取和EntityContainer中的所有EntitySet的節點:

/edmx:Edmx/edmx:Runtime/edmx:ConceptualModels/Schema/EntityContainer/EntitySet 

但我沒有得到任何結果使用此C#代碼:

XmlDocument xdoc = new XmlDocument("pathtoedmx"); 
var ns = new XmlNamespaceManager(xdoc.NameTable); 
ns.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2009/11/edmx"); 
ns.AddNamespace("annotation", "http://schemas.microsoft.com/ado/2009/02/edm/annotation"); 
ns.AddNamespace("p1", "http://schemas.microsoft.com/ado/2009/02/edm/annotation"); 
ns.AddNamespace("", "http://schemas.microsoft.com/ado/2009/11/edm"); 
var entitySets = xdoc.SelectNodes("/edmx:Edmx/edmx:Runtime/edmx:ConceptualModels/Schema/EntityContainer/EntitySet", ns); 

已從此工具獲得XPath(http://qutoric.com/xmlquire/),因爲我開始不相信自己的XPath技能,但它告訴我我已經使用了相同的XPath。

如果我刪除「/模式/ EntityContainer相關/ EntitySet的」部分其尋找「/ EDMX:EDMX/EDMX:運行/ EDMX:ConceptualModels」,但不會進一步對已經嘗試指定「EDMX 「namespace(」edmx:/ Schema「)但沒有區別。

希望你能幫助我,已經把我的頭撞在桌子上。 :)

+0

是否需要,如果沒有蜜蜂的XPath,您可能需要使用LinqToXml – CSharpie

回答

1

命名空間是關於如何將兩種不同的XML方言合併到單個文檔中的約定。只要你保持你的URI組件完全一樣,那些前綴真的不重要。舉例來說,採取這樣的事情:

ns.AddNamespace("xxx", "http://schemas.microsoft.com/ado/2009/11/edmx"); 
Console.WriteLine(xdoc.SelectNodes("/xxx:Edmx", ns).Count); // 1 

你會得到一個節點,因爲你的命名空間URI相匹配,儘管你的「錯誤」的命名空間前綴。

如果您有一個名爲xmlns的屬性,則當前元素及其子元素將繼承該名稱空間URI。

就你而言,你的根元素沒有默認的命名空間,這沒關係。但你的Schemas元素確實有一個名稱空間,你需要通知它。我想出了這個代碼:

// change "" to "edm" 
ns.AddNamespace("edm", "http://schemas.microsoft.com/ado/2009/11/edm"); 
var entitySets = xdoc.SelectNodes("/edmx:Edmx/edmx:Runtime/edmx:ConceptualModels/edm:Schema/edm:EntityContainer/edm:EntitySet", ns); 
+0

謝謝,你撞釘。 :) –