我有一个XML文档,其中包含一个内联XSD(如下所示)。问题是,我需要使用XSD中的属性来搜索XML内容,最好是在LINQ中(XPATH也可以)。
因此,在下面的示例中,我想通过从XSD中推断出sql:field
属性值CATALOG_NAME
,然后将其与XML文档CATALOG_NAMEC00
中的真实元素名称进行匹配来找到元素CATALOG_NAME
。一旦我有了元素,我就想要它的值。
我看到了许多XSD验证的例子和查询XSD本身的例子。最后,我正在寻找没有一些手动查找破解的"合并"功能。
这可能吗?
<return xmlns="urn:schemas-microsoft-com:xml-analysis">
<root xmlns="urn:schemas-microsoft-com:xml-analysis:rowset" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msxmla="http://schemas.microsoft.com/analysisservices/2003/xmla">
<xsd:schema targetNamespace="urn:schemas-microsoft-com:xml-analysis:rowset" xmlns:sql="urn:schemas-microsoft-com:xml-sql" elementFormDefault="qualified">
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="row" type="row" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="uuid">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}" />
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="xmlDocument">
<xsd:sequence>
<xsd:any />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="row">
<xsd:sequence>
<xsd:element sql:field="CATALOG_NAME" name="CATALOG_NAMEC00" type="xsd:string" minOccurs="0" />
<xsd:element sql:field="SCHEMA_NAME" name="SCHEMA_NAMEC01" type="xsd:string" minOccurs="0" />
<xsd:element sql:field="CUBE_NAME" name="CUBE_NAMEC02" type="xsd:string" minOccurs="0" />
<xsd:element sql:field="DIMENSION_UNIQUE_NAME" name="DIMENSION_UNIQUE_NAMEC03" type="xsd:string" minOccurs="0" />
<xsd:element sql:field="HIERARCHY_UNIQUE_NAME" name="HIERARCHY_UNIQUE_NAMEC04" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<row>
<CATALOG_NAMEC00>AGS PLANUNG_PA</CATALOG_NAMEC00>
<CUBE_NAMEC02>Aktionsplan</CUBE_NAMEC02>
<DIMENSION_UNIQUE_NAMEC03>[Planstand]</DIMENSION_UNIQUE_NAMEC03>
<HIERARCHY_UNIQUE_NAMEC04>[Planstand].[Planstand]</HIERARCHY_UNIQUE_NAMEC04>
</row>
</root>
</return>
您可以尝试以下XPath:
//*[local-name()=//*:element[@*:field='CATALOG_NAME']/@name]
这是XPath2.0,所以我使用*
作为名称空间前缀,但您可以声明名称空间并使用任何您想要的前缀。