【问题标题】:Create or emulate a single XML file or .ZIP (like .docx file) from a set of XML, DTD and XSL files从一组 XML、DTD 和 XSL 文件创建或模拟单个 XML 文件或 .ZIP(如 .docx 文件)
【发布时间】:2015-03-10 19:58:21
【问题描述】:

我有一个嵌套的文件夹结构结构,其中包含许多不同的文件(XML、DTD、XSL),其中 XML 文件引用其他 DTD、XSL 和其他 XML(也可以引用其他文件)。 IE。像这样(为简洁起见,我删除了一些类似的行):

all.xml - 根文件:

<?xml version="1.0" ?> 
<!DOCTYPE notification [
    <!ELEMENT notification ANY>
    <!ENTITY % types SYSTEM "dtd/types.dtd">
    <!ENTITY % from SYSTEM "dtd/from.dtd">

    <!ENTITY types_en SYSTEM "lang/en/types.xml">
    <!ENTITY from_en SYSTEM "lang/en/from.xml">
    <!ENTITY subj_ru SYSTEM "lang/ru/subjects.xml">
    <!ENTITY desc_en SYSTEM "lang/en/descriptions.xml">

    <!ENTITY regexp_en SYSTEM "lang/en/placeholders.xml">

    %types;
    %from;
]>

<notification>
&types_en;
&from_en;
&templ_fr;
</notification>

lang/en/descriptions.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" href="../../xsl/descriptions.xsl"?>
<!--DOCTYPE descriptions SYSTEM "../../dtd/descriptions.dtd"-->
<descriptions lang="en">

等等。因此,有一个根文件,其中包含 DTD 和许多其他文件,这些文件也包含自己的 DTD 和 XSL 表(不同的 XML 表)。

我需要找到将它们全部合并到一个文件中的方法。到目前为止,我发现的所有解决方案要么是合并多个独立的 XML 文件,要么是向文件添加单个 DTD(在我的情况下,不同的 DTD 应用于不同的文件,并不是所有的 XML 都是独立的,因为它们是嵌套的)。单个 XML 罚款的结果会很好。

或者,如果我能够将所有文件夹打包到一个文件 (.zip) 中,然后像 MS .docx 格式一样读取它(其中 .ZIP 文件表示具有工作引用的隔离文件系统),我几乎会很高兴在包含的文件之间)。该文件是用我自己的 C# 软件处理的,所以我不需要担心与其他 XML 阅读器的兼容性。但我不知道 .NET 中有什么方法可以让我像文件系统一样读取和 XML 解析 .ZIP 文件。

或者,也许有一种方法可以在使用 XmlTextReader 解析 XML 数据时捕获任何访问任何资源(无论是另一个 XML、DTD 还是 XSLT)的尝试?目的是能够拦截所有对丢失文件的请求,并在 XmlTextReader 请求时将所请求资源的内容提供给它们。

现在,我正在研究 System.IO.Packaging (OpenXML) 是否可以达到此目的。

【问题讨论】:

标签: c# xml xslt


【解决方案1】:

对于最后一个问题,您可以使用接受XmlReaderSettings 的静态XmlReader.Create() 方法之一创建XmlReader。您可以使用 XmlResolver 类的自定义实现来设置设置,该类将覆盖 ResolveUri()GetEntity() 方法。在这些方法中,您可以拦截对丢失文件的请求并使用您拥有的逻辑处理它。希望这会有所帮助。

【讨论】:

  • 谢谢。但我不知道如何使用这种方法。它只是让我替换资源的 URL,但我没有任何 URI 可以替换。我可以有要替换的文件内容(即嵌套的 XML 文件内容),但不能有它的 URI。如果我可以将文件内容注入 URI,这会起作用,但我认为这是不可能的。糟糕,错过了 GetEntity 部分。这有帮助,会试一试!
猜你喜欢
  • 1970-01-01
  • 2013-05-24
  • 2010-09-27
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2012-02-07
相关资源
最近更新 更多