代码之家  ›  专栏  ›  技术社区  ›  ProfK

如何使用xpath查询ef模型(edmx文档)

  •  3
  • ProfK  · 技术社区  · 15 年前

    我正在尝试编写一个自动设置 ProviderManifestToken edmx文档架构元素中的属性,但即使我的基本xpath也不起作用。我做错什么了?

    XML:

    <?xml version="1.0" encoding="utf-8"?>
    <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
      <!-- EF Runtime content -->
      <edmx:Runtime>
        <!-- SSDL content -->
        <edmx:StorageModels>
        <Schema Namespace="PvmmsModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005
    

    我的尝试:

            var edmx = new XmlDocument();            
            edmx.Load(@"C:\Development\Provantage\PvmmsApp\Model.edmx");
            var nsm = new XmlNamespaceManager(edmx.NameTable);
            nsm.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2007/06/edmx");
    
            var x = edmx.SelectSingleNode("//edmx:Edmx/edmx:Runtime/edmx:StorageModels", nsm);
    

    这是可行的,但一旦我附加 Schema 查询。然后我得到一个空结果。

    1 回复  |  直到 15 年前
        1
  •  7
  •   Pavel Minaev    15 年前

    以下是如何完成 Schema 元素的实际外观(您的代码片段似乎已被剪裁);

    <Schema xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"
            Namespace="Model1.Store"
            Alias="Self"
            Provider="System.Data.SqlClient"
            ProviderManifestToken="2005">
    

    注意 xmlns 部分。所以它实际上在一个名称空间中,尽管没有前缀。

    现在,在xpath中,缺少前缀 总是 表示“不在任何命名空间中”。因此,您需要为您的xpath绑定一些特定的前缀,并在查询中使用它:

    ...
    nsm.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl");
    var x = edmx.SelectSingleNode(
        "//edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema", nsm)