c#从xsi:schemaLocation属性值中获取.xsd的本地路径
本文关键字:xsd 获取 路径 xsi schemaLocation 属性 | 更新日期: 2023-09-27 18:05:16
我正在寻找一种最好的方法来提取模式的本地路径,而不使用regex。
示例:<?xml version="1.0"?>
<ord:order xmlns:ord="http://example.org/ord"
xmlns:prod="http://example.org/prod"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.org/prod chapter05prod.xsd
http://example.org/ord chapter05ord.xsd">
<items>
<prod:product>
<number xsi:type="xs:short">557</number>
<name>Short-Sleeved Linen Blouse</name>
<size xsi:nil="true"/>
</prod:product>
</items>
或
xsi:schemaLocation="http://example.org/prod ''RandomFolder'New'chapter05prod.xsd">
或
xsi:schemaLocation="chapter05prod.xsd">
我想获得*的本地路径。xsd文件。是否有任何方法可以使用xml解析器或xmlResolver或其他不使用正则表达式的方式来做到这一点?
编辑:我正在寻找一种最通用的方法来获得外部。xsd路径引用的路径。
另一个例子:
xsi:noNamespaceSchemaLocation="file://C://Documents and Settings//All Users//Application Data//My Application//MyData.xsd"
可以使用XPath:
using System;
using System.Xml;
using System.Xml.XPath;
由于所需的数据位于由名称空间限定的属性中,因此需要在执行XPath表达式之前注册名称空间。在您的情况下,您可以忽略命名空间,并使用像这样的表达式:
//@*[local-name()='schemaLocation']
,它将选择本地名称为schemaLocation
的属性节点(忽略其前缀)。
解析XML文件并获取根(文档)元素:
XmlTextReader reader = new XmlTextReader("your-file.xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);
reader.Close();
XmlElement root = doc.DocumentElement;
然后使用它来选择所有名为schemaLocation
的属性。只有一个,所以你可以使用SelectSingleNode
:
XmlNode schemaLocationAttribute = root.SelectSingleNode("//@*[local-name()='schemaLocation']");
上面的表达式包含该属性。您可以使用schemaLocationAttribute.Value
获取它的字符串内容。然后,您可以使用空白作为分隔符拆分内容:
string[] components = schemaLocationAttribute.Value.Split(null);
在components[1]
:
中有你想要的文本(chapter05prod.xsd
)Console.WriteLine (components[1]);
(注意:您不能总是忽略XPath名称空间-如果文件中有其他带有不同前缀或没有前缀的名为schemaLocation
的属性,它们也会被XPath表达式选择,此解决方案将失败。)