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"

c#从xsi:schemaLocation属性值中获取.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表达式选择,此解决方案将失败。)