当引用的架构文件位于不同的项目/程序集中时,如何在 VS 中指定 XSD schemaLocation 属性?

2023-12-24

EDIT请参阅下面我的解决方案/EDIT

我有一个包含两个项目的 Visual Studio 解决方案。

  • 项目 1(称为 ReferencedProject)包含一个 XML 架构文件 (ReferencedSchema.xsd)。
  • 项目 2(称为 MainProject)包含 ReferencedProject 作为参考。 MainProject 还有一个架构文件 (MainSchema.xsd)。

MainSchema.xsd 包含以下代码:

<?xml version="1.0"?>
<xs:schema
  xmlns="main"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:tns="main"
  targetNamespace="main"
  elementFormDefault="qualified">
  <xs:include schemaLocation="ReferencedSchema.xsd" />
  ...
</xs:schema>

由于 ReferencedSchema.xsd 不在同一个文件夹中(甚至不在同一个项目中),因此我收到一条错误消息“ReferencedSchema.xsd 无法解析”。说得通。

如果我将 xs:include 元素编辑为此...

<xs:include schemaLocation="../../ReferencedProject/Data/ReferencedSchema.xsd" />

...错误消失了。但是,请注意,我提供了一个仅适用于模式的相对路径within我的解决方案的文件夹层次结构。当我在编辑器中查看架构时,这很好,但当我编译项目时,效果就不那么好了。如果我在编译后查看“bin”文件夹,文件夹层次结构完全不同(两个 xsd 文件实际上最终位于同一文件夹中)。

我尝试使用 Visual Studio 的“将现有项目添加为链接”功能来解决此问题,将 ReferencedSchema.xsd 文件的快捷方式放在与我的主架构文件相同的文件夹中,但这不起作用。 XSD 验证器显然无法假装链接是实际文件。

所以,我的问题是,我似乎没有可以为 schemaLocation 提供的任何 uri 在这两种情况下都有效(在解决方案资源管理器内和运行时期间)。有没有人有什么建议?

Thanks!

EDIT

我决定这样做:

<xs:include schemaLocation="../../ReferencedProject/Data/ReferencedSchema.xsd" />

只要我在 Visual Studio 中查看内容,这是正确的,但在运行我的代码时,这是错误的。

为了使其在运行时也能工作,我动态地将 schemaLocation 替换为正确的相对引用,如下所示:

public class UriReplacingXmlValidator
{
    public virtual XDocument Validate(
        string dataFolderName,
        string baseDataFolderName,
        string xmlFileName,
        string schemaFileName,
        string baseSchemaFileName)
    {
        string rootFolderPath = Environment.CurrentDirectory + Path.DirectorySeparatorChar;
        string dataFolderPath = rootFolderPath + Path.DirectorySeparatorChar + dataFolderName;
        string baseDataFolderPath = rootFolderPath + Path.DirectorySeparatorChar + baseDataFolderName;
        string xmlPath = dataFolderPath + Path.DirectorySeparatorChar + xmlFileName;
        string schemaPath = dataFolderName + Path.DirectorySeparatorChar + schemaFileName;
        string baseSchemaPath = baseDataFolderName + Path.DirectorySeparatorChar + baseSchemaFileName;
        XDocument xmlDocument = XDocument.Load(xmlPath);
        XDocument schemaDocument = XDocument.Load(schemaPath);
        ResetBaseSchemaLocation(schemaDocument, baseSchemaPath);
        XmlValidator validator = new XmlValidator();
        bool isValid = validator.Validate(xmlDocument, schemaDocument);
        if (isValid)
            return xmlDocument;
        else
            return null;
    }

    protected virtual void ResetBaseSchemaLocation(XDocument schemaDocument, string baseSchemaPath)
    {
        XNamespace ns = "http://www.w3.org/2001/XMLSchema";
        XAttribute attribute = schemaDocument.Element(ns + "schema").Element(ns + "redefine").Attribute("schemaLocation");
        attribute.Value = baseSchemaPath;
    }

我选择了这个解决方案,因为现在无论我是在 Visual Studio 中查看 XML 和 XSD 文件还是运行/调试我的应用程序,一切都可以正常工作。


XSD 仅支持 URI 位置,不支持路径位置。这意味着file:///C:/path/to/VS/Projects/ReferencedProject/Data/ReferencedSchema.xsd有效,但无效../../ReferencedProject/Data/ReferencedSchema.xsd.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当引用的架构文件位于不同的项目/程序集中时,如何在 VS 中指定 XSD schemaLocation 属性? 的相关文章

  • 单元测试报告的 XML 格式规范(DTD、XSD..)

    许多工具为单元测试报告生成和使用相同的 XML 文件格式 例子 source http junitpdfreport cvs sourceforge net junitpdfreport src resources examples tes
  • 检查应用程序是否从 Visual Studio 调试会话中启动

    我正在开发一个安装系统范围键盘的应用程序 钩 我不想在运行调试时安装这个钩子 从视觉工作室内部构建 否则它会挂起工作室 以及最终的系统 我可以通过检查是否 DEBUG 符号已定义 但是 当我调试时release应用程序的版本是 有一种方法可
  • 在 iOS 上使用 Web 服务的最佳方式?

    我想构建一个 iOS 应用程序 让您登录到网络服务 之后 应用程序将 当用户选择时 通过 https 发送登录名 密码以及请求的变量 例如 在请求 新闻更新 后 它将收到 XML 格式的请求信息 类似于
  • 使用 dpi 与 dp 缩放图像之间的差异

    我拥有所有由九个补丁位图组成的 dpi 可绘制目录 xxhdpi 和 xxxhdpi 是否必要 可绘制目录中的可绘制资源文件可检索所有缩放的位图 并且我使用可绘制资源文件 现在 我的问题是我还根据大小 小 正常等 创建了 缩放 布局目录 其
  • xml 模式属性参考

    我有这个 xml 模式
  • 如何使用C#在asp.net中下载xml文件

    我正在使用网络应用程序ASP NET 与 MVC3 我是 mvc3 的新手 我的网页上有一个下载按钮 当我要单击下载按钮时 我希望能够打开该 XML 文件 我尝试过一些代码更改动作结果但我没有打开文件 通过使用下面提到的代码 我收到一个下载
  • 将 XSD 文件转换为 C# 可序列化类

    我尝试遵循以下答案这个问题 https stackoverflow com questions 87621 how do i map xml to c objects 但无法让 xsd exe 愉快地获取 XSD 文件并将它们转换为类 此处
  • 如何使用XPath选择非空段落?

    我想要抓取的网页具有类似的结构 每个都有一个段落是一个问题 一个段落是一个答案 我想抓取每个问题和答案并将它们存储在两个项目中 问题是 在某些页面上 问题和答案分别是 xxx p 1 and xxx p 2 但在其他页面上 xxx p 1
  • 标准标头上的 Visual Studio 2017 错误

    我刚刚升级到 Visual Studio 2017 Community Edition 但在加载标准头文件时遇到问题 我从各种头文件中收到 507 错误 以下是一些片段 一些错误 Severity Code Description Proj
  • Resharper 删除了 CTRL + .快速操作任务

    所以我终于尝试了 ReSharper 到目前为止它还不算太糟糕 但它似乎确实取代了很多按键绑定 我保留了原来的 VS 键绑定 每次当我被问到当存在冲突键绑定时我想做什么时 这很酷 不过 我似乎失去了 CTRL QuickActions 窗口
  • 使用 XProc 进行 XML 流处理

    我正在玩xproc http www w3 org TR xproc XML 管道语言和http xmlcalabash com http xmlcalabash com 我想找到一个流式传输大型 xml 文档的示例 例如 给定以下内容hu
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • & 在 XML 代码中导致错误的符号

    我有以下 XML 代码 用于过滤我的 Crm Dynamics 表单中的查找字段 该过滤器根据输入帐户字段的数据使用 但是 帐户字段可以包含 符号 当出现时 会发生错误 表明 XML 格式不正确 有人有解决问题的办法吗 function a
  • 可以从 Visual Studio Team Studio 中的编码 WebTest 创建独立的 .EXE

    我正在运行 VS Team Studio 2008 我创建了一个 Web 测试 我想用它来监视公司网站 它与站点交互并进行一些往返处理 我想创建一个可以远程运行的独立 EXE 文件 我尝试将其转换为 VB 代码和 C 代码 然后将其编译为
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 在 VS 2012 中创建并运行 MVC 5 项目

    由于某种原因 我的 Visual Studio 2013 预览版无法创建 MVC 5 项目 由于 MVC 项目现已在 CodePlex 中开源 我想知道是否有一种简单的方法可以在我的 Visual Studio 2012 Ultimate
  • python suds SOAP 请求中的名称空间前缀错误

    我使用 python suds 来实现客户端 并且在发送的 SOAP 标头中得到了错误的命名空间前缀 用于定义由element ref 在 wsdl 中 wsdl 正在引用数据类型 xsd 文件 请参见下文 问题出在函数上GetRecord

随机推荐