我有这个要解析的文件:
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="DataModel.Store" Alias="Self" Provider="System.Data.SqlServerCe.3.5" ProviderManifestToken="3.5" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
<EntityContainer Name="DataModelStoreContainer">
<EntitySet Name="erpBarcode" EntityType="DataModel.Store.erpBarcode" store:Type="Tables" />
...
...
</EntityContainer>
<EntityType Name="erpBarcode">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="uniqueidentifier" Nullable="false" />
<Property Name="Barcode" Type="nvarchar" Nullable="false" MaxLength="100" />
<Property Name="ProductNo" Type="nvarchar" Nullable="false" MaxLength="100" />
<Property Name="UnitNo" Type="int" Nullable="false" />
<Property Name="IsActive" Type="bit" Nullable="false" />
</EntityType>
<EntityType Name="erpCustomer">
...
</EntityType>
<EntityType Name="erpOperation">
...
</EntityType>
...
</Schema>
我想从文档中检索所有EntityType节点。 首先,我在XPathVisualizer中尝试了XPath表达式,并正确检索了所有节点。问题是当我搬到C#时。上面是我正在使用的代码,我无法弄清楚错误的位置,因为节点列表总是空的。
var xmldoc = new XmlDocument();
xmldoc.Load(_fileName);
var xmlnsManager = new XmlNamespaceManager(xmldoc.NameTable);
//Add the namespaces used to the XmlNamespaceManager
xmlnsManager.AddNamespace("ns1", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl");
xmlnsManager.AddNamespace("store", "http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator");
var xpath = @"//ns1:Schema/EntityType";
XmlNodeList nodeList = xmldoc.SelectNodes(xpath, xmlnsManager);
foreach (XmlNode node in nodeList)
{
Console.WriteLine(node.InnerText);
}
答案 0 :(得分:0)
默认名称空间是继承的。
var xmlnsManager = new XmlNamespaceManager(xmldoc.NameTable);
xmlnsManager.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl");
var xpath = @"/ssdl:Schema/ssdl:EntityType";
// ------------------------^^^^^
XmlNodeList nodeList = xmldoc.SelectNodes(xpath, xmlnsManager);
请注意,这也可以使用
var xpath = @"//ssdl:EntityType";
P.S。:没有充分的理由使用ns1
作为前缀,使用自然更有意义的东西。