【问题标题】:c# get local path of .xsd from xsi:schemaLocation attribute valuec# 从 xsi:schemaLocation 属性值获取 .xsd 的本地路径
【发布时间】:2014-07-14 06:13:56
【问题描述】:

我正在寻找一种不使用正则表达式来提取架构的本地路径的最佳方法。

示例:

<?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"

【问题讨论】:

  • 请注意,noNamespaceSchemaLocation 需要有效的 URI 方案,但在您上面添加的最后一个示例中并非如此,因为它包含无效路径(路径中不能有双斜杠,仅在路径之前的分层部分中)。

标签: c# xml-parsing xsd schema


【解决方案1】:

您可以使用 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 表达式选择,并且此解决方案会失败。​​)

【讨论】:

  • 非常感谢您的帮助。您的解决方案在相同情况下似乎很有用。我会对此投赞成票,但我会再等几天以获得更通用的方法。如果没有,那么我会接受你的回答。顺便说一句,我不知道传递 null 时 string.split 的默认值是空格。现在我正在使用 Linq 方法来获取 schemaLocation 属性,然后以某种方式提取路径。但是,您编写的拆分方法比我的正则表达式尝试更好。但是,当路径中有空格时它会失败。谢谢。
  • schemaLocationnoNamespaceSchemaLocation 中的路径中不应存在空格,因为有效的URI 方案要求它们被转义(到%20)。因此,像 file:///c:/My Directory/file.xsd 这样的 URL 将被包含为 file:///c:/My%20Directory/file.xsdschemaLocation 中的空格也很重要,因为它们用于将每个架构与其位置以及架构/位置对分开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2011-04-04
  • 2010-10-31
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
相关资源
最近更新 更多