当前位置: 首页 > 知识库问答 >
问题:

从Saxon 9.4he中的嵌入式资源加载xml和xslt

宋洲
2023-03-14

我正在使用Saxon 9.4家庭版(Saxon-HE 9.4. NET)来获得对XSLT 2.0和XPath 2.0以及XQuery 1.0的支持。NET。当我加载没有URI的文件时,我的代码会崩溃。

  1. 是否可以在没有与加载的文档相关的URI的情况下加载xml/xsl文档
  2. 如果没有,是否有任何方法可以为嵌入在dll文件中的元素定义URI

任何其他解决方案也将被理解,我唯一的术语是文件必须从dll文件中加载。

只要我从文件加载xml/xsl,我的代码就可以完美运行:

const string sourcePath = @"C:\test\TestInvoiceWithError.xml";
const string xsltpath = @"C:\test\UBL-T10-BiiRules.xsl";

当我尝试从嵌入式资源加载时,代码会抛出一个异常,说明“没有提供基本URI”:

Stream sourceStream = GetEmbeddedResource("TestProject1.testfiles.TestInvoice.xml");
Stream xsltStream = GetEmbeddedResource("TestProject1.testfiles.UBL-T10-BiiRules.xsl");

我还为具有相对路径的资源创建了Uri,该Uri引发异常“相对Uri不支持此操作”:

Uri sourceUri = new Uri("/TestProject1;component/testfiles/TestInvoice.xml",     UriKind.Relative);
Uri xsltUri = new Uri("/TestProject1;component/testfiles/UBL-T10-BiiRules.xsl.xml", UriKind.Relative);

这是我的代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
using System.Xml;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Saxon.Api;


namespace TestProject1
{
    [TestClass]
    public class XsltTest
    {
        [TestMethod]
        public void SaxonTest()
        {
            Stream sourceStream = GetEmbeddedResource("TestProject1.testfiles.TestInvoice.xml");
            Stream xsltStream = GetEmbeddedResource("TestProject1.testfiles.UBL-T10-BiiRules.xsl");

            Uri sourceUri = new Uri("/TestProject1;component/testfiles/TestInvoice.xml", UriKind.Relative);
            Uri xsltUri = new Uri("/TestProject1;component/testfiles/UBL-T10-BiiRules.xsl.xml", UriKind.Relative);

            const string sourcePath = @"C:\test\TestInvoiceWithError.xml";
            const string xsltpath = @"C:\test\UBL-T10-BiiRules.xsl";

            Processor processor = new Processor();
            XdmNode input = processor.NewDocumentBuilder().Build(new Uri(sourcePath));

            XsltTransformer transformer = processor.NewXsltCompiler().Compile(new Uri(xsltpath)).Load();

            transformer.InitialContextNode = input;

            Serializer serializer = new Serializer();
            StringBuilder sb = new StringBuilder();
            TextWriter writer = new StringWriter(sb);
            serializer.SetOutputWriter(writer);

            transformer.Run(serializer);

            XmlDocument xmlDocOut = new XmlDocument();
            xmlDocOut.LoadXml(sb.ToString());
            XmlNodeList failedAsserts = xmlDocOut.SelectNodes("/svrl:schematron-output/svrl:failed-assert",XmlInvoiceNamespaceManager());

            if (failedAsserts == null)
                return;

            foreach (XmlNode failedAssert in failedAsserts)
            {
                if (failedAssert.Attributes == null)
                    continue;

                XmlAttribute typeOfError = failedAssert.Attributes["flag"];

                if (typeOfError.Value.Equals("warning"))
                {/*Log something*/}
                else if (typeOfError.Value.Equals("fatal"))
                {/*Log something*/}
            }
        }

        private XmlNamespaceManager XmlInvoiceNamespaceManager()
        {
            IDictionary<string, string> list = new Dictionary<string, string>
                                                   {
                                                       {"xml", "http://www.w3.org/XML/1998/namespace"},
                                                       {"xsi", "http://www.w3.org/2001/XMLSchema-instance"},
                                                       {"xsd", "http://www.w3.org/2001/XMLSchema"},
                                                       {"udt","urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"},
                                                       {"qdt","urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"},
                                                       {"ext","urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"},
                                                       {"ccts", "urn:un:unece:uncefact:documentation:2"},
                                                       {"cbc","urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"},
                                                       {"cac","urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"},
                                                       {"inv", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"},
                                                       {"svrl", "http://purl.oclc.org/dsdl/svrl"}
                                                   };

            XmlNameTable xmlNameTable = new NameTable();

            XmlNamespaceManager xmlInvoiceNamespaceManager = new XmlNamespaceManager(xmlNameTable);

            foreach (KeyValuePair<string, string> ns in list)
            {
                xmlInvoiceNamespaceManager.AddNamespace(ns.Key, ns.Value);
            }
            return xmlInvoiceNamespaceManager;
        }

        protected static Stream GetEmbeddedResource(string path)
        {
            Assembly asm = Assembly.GetExecutingAssembly();
            Stream stream = asm.GetManifestResourceStream(path);
            return stream;
        }
    }
}

共有2个答案

晋承嗣
2023-03-14

最近,我遇到了这个问题。这就是我的解决方案。

private void test() {
        Stream xsltStream = GetEmbeddedResource("TestSaxon.Resources.test.xsl");

        Processor processor = new Processor();

        DocumentBuilder db = processor.NewDocumentBuilder();
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(xsltStream);

        XdmNode xdmNode = db.Build(xmlDocument);

        XsltTransformer transformer = processor.NewXsltCompiler().Compile(xdmNode).Load();
        var path = AppDomain.CurrentDomain.BaseDirectory;
        var input = new FileInfo(path + @"\input.xml");
        var output = new FileInfo(path + @"\result.xml");
        var destination = new DomDestination();
        using (var inputStream = input.OpenRead())
        {
            transformer.SetInputStream(inputStream, new Uri(input.DirectoryName));
            transformer.Run(destination);
        }
        destination.XmlDocument.Save(output.FullName);
    }

    protected static Stream GetEmbeddedResource(string path)
    {
        Assembly asm = Assembly.GetExecutingAssembly();
        Stream stream = asm.GetManifestResourceStream(path);
        return stream;
    }
蒋向笛
2023-03-14

我认为您可以使用Saxon从流加载,但您需要首先设置一个基本URI,以允许加载任何引用资源(例如XML文档中的DTD或包含或导入的样式表模块)。如果您确定您没有,那么只需尝试例如。

DocumentBuilder db = processor.NewDocumentBuilder();
db.BaseUri = new Uri("file:///C:/");

XdmNode input = db.Build(xsltStream);

显然,如果您需要在XSLT中解析也要作为嵌入式资源加载的相对URI,那么需要做更多的工作:您需要将XML解析器设置为支持从嵌入式资源加载资源的类,并在XSLT中设置URI方案,以向解析器指示您需要从资源加载。我不认为。NET framework提供了这样一种XmlResolver,而Uri类也不支持自定义模式。

 类似资料:
  • 问题内容: 我已经编写了一个解析器,用于解析HttpURLConnection中的xml文件。这很好。 问题:我需要重写此文件,以便从本地资源而不是从Internet加载xml文件,但是我无法使它正常工作……只是让您了解原始Web解析器的外观: 现在,这里是我用来尝试从位于资源文件夹中xml / myfile.xml的本地资源解析的代码: 本地xml文件和网络文件完全相同…如果有人看的话:http

  • 嵌入资源 嵌入资源即内容嵌入,可以为工程师提供诸如图片base64嵌入到css、js里,前端模板编译到js文件中,将js、css、html拆分成几个文件最后合并到一起的能力。有了这项能力,可以有效的减少http请求数,提升工程的可维护性。 fis不建议用户使用内容嵌入能力作为组件化拆分的手段,因为声明依赖能力会更适合组件化开发。 在html中嵌入资源 在html中可以嵌入其他文件内容或者base6

  • 在使用Maven捆绑JAR文件中的资源时,我有一种感觉,我错过了一些关键的东西。我的目录结构是标准的Maven结构(即\src\main\java,\src\main\Resources)。 使用IDE时,我将资源文件引用为\main\resources\images\blah。。。它工作得很好,但当Maven捆绑JAR文件时,它会将路径放在相对于根的位置(“\ images\blah”),因此没

  • 下面是一个我正在与SDR斗争的用例- 这是用户表和参考问题表 这是用户表和用户好友表 当我转到/users/{id}/userFriends时,默认情况下应该显示UserProjection中的firstname、lastname等 因此,我在UserRepository中启用了摘录投影,效果很好。我预计这里会有大约100个结果,所以如果这个结果没有分页的话就可以了。 但是,既然RefSecQue

  • 我想使用REST API的HAL格式来包含嵌入式资源。我在API中使用Spring HATEOAS,Spring HATEOAS似乎支持嵌入式资源;但是,没有关于如何使用此功能的文档或示例。 有人能提供一个如何使用Spring HATEOAS包含嵌入式资源的例子吗?

  • 6.10 嵌入式资源 6.10.1 简介 在Web应用程序中,ABP提供了一个简单的方法来使用嵌入式的 Razor视图(.cshtml文件)和 其它资源(css,js,img等文件)。你可以使用该功能来创建包含UI功能的插件/模块。 6.10.2 创建嵌入式文件 首先,我们应该创建一个文件并且标记它为 嵌入式资源。任何程序集都可以包含嵌入式资源文件。至于如何标记它,这要看你的项目是什么格式的。 项