Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >处理xsd:将xsd作为嵌入式资源包含在Visual Studio中

处理xsd:将xsd作为嵌入式资源包含在Visual Studio中
EN

Stack Overflow用户
提问于 2013-08-16 13:26:11
回答 2查看 2.7K关注 0票数 1

我有一组XSD,可以针对XMLSPY和Java代码进行验证。我需要将这组XSD作为Visual Studio2012 .net中的嵌入式资源。不幸的是,当我试图用一个自定义的XmlResolver来处理xsd:include时,我得到了一个错误,一个全局元素已经被声明了。Error很奇怪,因为元素只声明了一次。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Visual Studio Solution
    |-----------    Visual Studio Project
            |-----------    Schemas (Embedded Resource)
                    |-----------    Directory A
                            |------------ set of XSDs that are referenced by XSDs in Directory B and to a globaltype definition file located in this directory
                    |-----------    Directory B
                            |------------- set of XSDs that reference each other and those in Directory A, the XSD call from the main is located here

正在验证实用程序类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;

namespace ABC.XYZ.Utils
{
    public static class XmlUtil
    {
        private static bool isValid;

        public static bool ValidateXml(string targetNamespace, string schemaUri, string xml)
        {
            isValid = true;

            var schemaReaderSettings = new XmlReaderSettings() { ValidationType = ValidationType.Schema };
            schemaReaderSettings.ValidationEventHandler += MyValidationHandler;

            schemaReaderSettings.Schemas.XmlResolver = new XmlResourceResolver();
            var schemaReader = XmlReader.Create(GetSchemaStream(schemaUri), schemaReaderSettings);
            schemaReaderSettings.Schemas.Add(targetNamespace, schemaReader);

            var x = XElement.Parse(xml);
            var sr = new System.IO.StringReader(x.ToString());

            XmlReader validatingReader = XmlReader.Create(sr, schemaReaderSettings);

            while (validatingReader.Read())
            {
            }

            validatingReader.Close();

            return isValid;
        }

        private static void MyValidationHandler(object sender, ValidationEventArgs args)
        {
            Console.WriteLine("***Validation error");
            Console.WriteLine("\tSeverity:{0}", args.Severity);
            Console.WriteLine("\tMessage:{0}", args.Message);
            isValid = false;
        }

        private static Stream GetSchemaStream(string relativeFileName)
        {
            var resourceFileName =
                Assembly.GetExecutingAssembly()
                    .GetManifestResourceNames()
                    .FirstOrDefault(p => p.EndsWith(relativeFileName));
            return Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceFileName);
        }

    }
}

自定义XmlResolver

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace ABC.XYZ.Utils
{
    public class XmlResourceResolver : XmlResolver
    {
        public const string AssemblyDefaultNamespace = "ABC.XYZ";
        public const string SchemasNamespace = "Schemas";

        public override Uri ResolveUri(Uri baseUri, string relativeUri)
        {
            var result = new UriBuilder("res://", AssemblyDefaultNamespace, -1, SchemasNamespace.Replace(".", "/"));
            result.Path += "/" + relativeUri.Replace("../", "/").TrimStart('/');
            return result.Uri;
        }

        public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
        {
            if (absoluteUri.Scheme != "res") return null;
            Debug.WriteLine("Loading resource based on location {0}", absoluteUri);

            var assembly = Assembly.GetExecutingAssembly();
            var name = String.Format(CultureInfo.InvariantCulture, "{0}{1}",
                absoluteUri.Host,
                absoluteUri.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped).Replace("/", "."));

            // try for an exact match based on schemaLocation hint path
            var resourceName = (from x in assembly.GetManifestResourceNames()
                                where name.Equals(x, StringComparison.OrdinalIgnoreCase)
                                select x).FirstOrDefault();

            // if not match based on filename alone
            if (resourceName == null)
            {
                var schemaDocumentName = Path.GetFileName(absoluteUri.AbsolutePath);
                Debug.WriteLine("Unable to locate exact match, looking for match based on filename {0}", schemaDocumentName);
                resourceName = (from x in assembly.GetManifestResourceNames()
                                where x.Contains(SchemasNamespace) && 
                                      x.EndsWith("." + schemaDocumentName, StringComparison.OrdinalIgnoreCase)
                                select x).FirstOrDefault();
            }

            Debug.WriteLine("Loading resource {0}", resourceName);
            var stream = assembly.GetManifestResourceStream(resourceName);
            return stream;
        }
    }

}

对这个问题的任何见解都将非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2013-08-16 14:04:14

XSD1.0鼓励但不要求验证器检测同一模式文档的多个包含(或导入),并且只包含它们一次。

其结果是,在多个其他模式文档中多次包含相同的模式文档是创建XSD互操作性噩梦的最简单方法。(不是唯一的方法,只是最简单的方法。)如果您拥有架构文档,请将导入时的所有包含和所有架构位置信息隔离到驱动程序文件中,并从“普通”架构文档中删除导入时的所有包含和所有架构位置提示。

票数 0
EN

Stack Overflow用户

发布于 2013-08-16 16:53:29

问题是,当您使用XMLSpy时,XSD是文件系统中的文件;那么发生了什么,每个文件都有一个基本URI,因此解析器将使用该信息来确保一旦加载了XSD,根据URI比较,不会再次加载相同的XSD。

现在,通过从程序集中加载流的方式,所有的信息都消失了(流没有基础URI)。您的解析器将从不同的位置一次又一次地加载相同的XSD,从而造成这种冲突。

据我所知,所有的XSD处理器都不使用任何其他方法来过滤相同XSD内容的多个包含,而是基源URI。

在.NET中,最简单的方法可能是(同样,取决于您的图的复杂程度)在this post中尝试解决方案;整个想法是提供一个基本URI,它应该提供避免多个包含所需的信息。

另一种选择可能是在自定义解析器中确保对于要解析的任何给定URI,只返回一次流(在所有其他情况下都返回null )。只要您没有使用xsd:redefine组合(在这种情况下,解决方案是对模式文件图进行拓扑排序,并确保首先加载所有xsd: composition ),这就可以保证正常工作。

根据@CMSperbergMcQueen的观点,一种保证有效的方法是重构所有XSD,使得每个名称空间只有一个XSD嵌入资源;每个XSD将删除所有导入(称为“悬挂”的技术)。将这些XSD作为独立的XSD添加到XML Schema集合中并进行编译。除非您遇到.NET错误,否则结果应该是一个已编译的XmlSchemaSet。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18274445

复制
相关文章
我的大学–我技术方向的转变
自从我和我的一个同学都把自己的电脑搬到实验室以后,我们两个就变成了整个实验室、乃至整个学校里面最疯狂的人,我们除了洗漱回一趟寝室以外我们所有的时间都待在实验室,当然除了上课和吃饭。当时我们的课程管得比较严,每次辅导员都会亲自到场点名,如果发现谁没有到就可能找他谈话,所以很多人虽然不想去上课,但是还是会去把时间混满。虽然我和我的那个同学基本上都是在一起学习和吃饭,但是平时交流并不是很多,造成这种原因不能不说说我们对技术方向的选择问题。 因为自己学会使用搜索引擎以后,有什么迷惑和疑问都会在网上找一些资
技巅
2018/05/25
5860
【方向】开启您的数据科学方向
如果您对数据科学感兴趣,但不知道从何处开始,这边文章适合您。 本文对数据科学众多方向进行简要描述,您不需要全部学习,只需要选择一个,从第一步开始执行,您将会学到更多东西。您不要犹豫应该选择那一个,这里
陆勤_数据人网
2018/02/28
9730
【方向】开启您的数据科学方向
WPF 使用 ItemsPanel 修改方向
在 WPF 很多时候都需要使用 ListView 但是默认的列表是垂直的,如果需要使用水平的,就需要使用 ItemsPanel 设置使用的类
林德熙
2022/08/04
5680
WPF 使用 ItemsPanel 修改方向
在 WPF 很多时候都需要使用 ListView 但是默认的列表是垂直的,如果需要使用水平的,就需要使用 ItemsPanel 设置使用的类
林德熙
2019/03/13
1.4K0
WPF 使用 ItemsPanel 修改方向
我打算这么做巡检方向的事情
巡检的工作其实是比较枯燥和乏味的,在某种程度上,他的工作和监控是有很多交集的,其实在很多公司里面,巡检方向的落地情况其实不容乐观,采用脚本和被动触发的方式效率不高,同时巡检中发现的潜在业务问题和业务部门是隔离的,也就是你在做的事情,业务部门不知道,自然就没法给予充分理解了,所以在问题的处理效率和响应上会是一个黑盒的状态,我觉得这也就是运维方向比较苦逼的一个原因。
jeanron100
2018/10/24
1.1K0
方向余弦
设 其中 、 、 是一组标准正交基的单位基底向量, 、 、 分别为 在 、 、 上的分量,则 对于 、 、 的方向余弦 、 、 分别为
hotarugali
2022/03/17
1.7K0
旋转方向
单个返回值形式: retval= ((226.83999633789062, 62.23775100708008), (103.79611206054688, 110.34321594238281), 80.08370208740234) 三个返回值形式: (x,y)=( 226.83999633789062 62.23775100708008 ) (MA, ma)=( 103.79611206054688 110.34321594238281 ) angle= 80.08370208740234
裴来凡
2022/05/28
1.3K0
旋转方向
让ZeGraph在X方向上填满
默认的效果是 希望能够在x方向上填满,两边不留。尝试出来的方法是:用zg1.GraphPane.XAxis.Scale.Max 和Min来设置,而且必须在画完图后设置。 zg1.GraphPane.C
用户1075292
2018/01/23
4840
让ZeGraph在X方向上填满
OpenCV中如何获得物体的主要方向
问题来源为网友提供的资料,原文为:《Object Orientation, Principal Component Analysis & OpenCV》
OpenCV学堂
2018/07/26
3.4K0
OpenCV中如何获得物体的主要方向
SaaS方向的思考
来源:SaaS产品说 |作者:李东林 ---- 本文作者李东林,微信号jianguzhuxin, 菜小秘联合创始人CEO,36Kr特约作家,SaaS产品说主笔。 上篇文章“原则系列-2020年终章之SaaS能够走多远”写完,引起了不小的反响,也有很多朋友提出进一步的问题,所以在这篇里面,对一些问题以及方向,基于自己的经验,给出一些一家之言的观点。 本文主要内容: SaaS赛道可持续发展性的相关因素 OA,HR,CRM等通用SaaS的一点浅见 垂直产业SaaS赛道的一点浅见 关于人工智能在Saa
腾讯SaaS加速器
2021/02/04
7060
IT软件的编程方向
IT软件的编程方向 - 进阶者系列 - 学习者系列文章 IT软件经过了这么些年的发展,已经形成了很多的软件公司和开发团队,而且当前编程语言也有很多种,让开发人员能够有很大的选择。现在国际上的开发阵营基本分为ASP.NET、JAVA和PHP三种,但是每种开发语言能够进行的开发问题是统一的,本文就从IT软件的编程方向出发,介绍下当前主流的开发方向。 一、网站; 现在的互联网,随着电子商务的发展和企业内部办公系统的应用,以及编程语言的三大阵营的发展,已经形成了很多具体应用的网站系统。但是,在企业内部,很多还是使用
L宝宝聊IT
2018/06/20
1.4K0
DBA的技术方向
好久没有更新文章了,国庆7天居家隔离,在这假期即将结束的下午,终于迎来了自由。跟大家聊聊技术方向的事情(纯属扯淡,哈哈)。其实我个人是很少发表一些主观的东西在公众号上。我觉得技术是技术,生活是生活。
DBA札记
2022/12/19
7600
DBA的技术方向
单细胞技术在临床上的应用方向
在我们错过的岁月里,我们看到NGS在临床上的应用主要是检测和诊断。近来,随着NGS技术的下沉和成熟,我们看到它开始在药物开发中得到应用。
生信技能树jimmy
2020/07/21
6390
单细胞技术在临床上的应用方向
2022-04-30:在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正
2022-04-30:在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意:
福大大架构师每日一题
2022/04/30
6690
[强网杯2021-线上赛] Pwn方向writeup
堆有rwx权限,下标溢出写got函数为堆地址,在两个堆块上拼接shellcode调用read读入shellcode进行orw拿flag
赤道企鹅
2022/08/01
6400
[starCTF / *CTF 2021] Pwn方向writeup
白给题,触发malloc_consolidate就可以leak+overlapping了
赤道企鹅
2022/08/01
5330
万字长文:读博之前,我希望有人告诉过我这些(计算机/NLP/机器学习方向)
又是一年申请季。 “要不要继续学术?”你可能纠结过、困惑过。你也许曾坚定地希望推动世界的进步,但你准备好付出五年甚至更久的青春了吗? 本文是两个自然语言处理/机器学习方向的学者给出的“博士生存指南”,关于如何做好科研、自我管理和规划职业。这些原则不仅针对计算机领域,对其他方向的学习者也适用。花点时间读完,相信你一定会有所收获。 无论读博与否,你都需要“Do what makes you happy”。 作者:Mark Dredze, Hanna M. Wallach 编译:Mirra, 刘晓莉, Sophi
大数据文摘
2018/05/24
1.5K0
MLSQL与JuiceFS在AI方向的整合畅享
RespectM同学在文章[MLSQL集成JuiceFs](16 - MLSQL集成JuiceFs)中,已经详细的讲解了如何整合两者。丢一个配置文件到SPARK_HOME/conf以及启动时带上SDK Jar就可以完美在MLSQL访问各种对象存储和HDFS了,这非常酷。
用户2936994
2022/07/21
4340
像 google 一样测试系列之二:方向篇
本文主要探讨了如何像Google一样进行Android测试,通过分析Google的测试代码结构和运行原理,以及开发团队对代码的覆盖率分析,总结了Google单测框架的结构和实现方式。同时,本文还探讨了如何通过单测框架达到高覆盖率,以及Google所采用的一些测试方法和工具。
腾讯移动品质中心TMQ
2017/09/19
1.6K0
像 google 一样测试系列之二:方向篇
为什么局部下降最快的方向就是梯度的负方向?
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/red_stone1/article/details/80212814
红色石头
2019/05/25
1.3K0

相似问题

使用Google地图获取方向问题

16

当URL有参数时,启用Google方向

24

在Ionic Framework Google Map中获取方向

10

获取Google Map方向问题

10

Google方向API获取错误

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文