xml – 如何使用XPath查询EF模型(EDMX文档)

我正在尝试编写一个实用程序,它自动在EDMX文档Schema元素中设置ProviderManifestToken属性,但即使我的基本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附加到查询中.然后我得到一个null结果.

解决方法

这是一个完整的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)

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念