XPath not working

本文关键字:working not XPath | 更新日期: 2023-09-27 18:35:52

我正在尝试从实体框架读取EDMX文件中的实体集。

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);

已经从这个工具(http://qutoric.com/xmlquire/)获得了XPath,因为我开始不信任自己的XPath技能,但它告诉我我已经使用的相同XPath。

如果我删除"/Schema/EntityContainer/EntitySet"部分,它会找到"/edmx:Edmx/edmx:Runtime/edmx:ConceptualModels",但没有进一步尝试指定"edmx"

命名空间("edmx:/Schema"),但没有区别。

希望你能帮帮我,已经把我的头撞在桌子上了。 :)

XPath not working

命名空间

是关于如何将两种不同的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);