【问题标题】:How can I "include" one XML file into another XML file?如何将一个 XML 文件“包含”到另一个 XML 文件中?
【发布时间】:2010-12-04 12:39:31
【问题描述】:

我有一个 XML 架构,例如:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MySchema"
    targetNamespace="http://tempuri.org/MySchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/MySchema.xsd"
    xmlns:mstns="http://tempuri.org/MySchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="MyDocument">
    <xs:complexType>
      <xs:all>
        <xs:element name="TextHeader" type="xs:string" minOccurs="0" />
        <xs:element name="TextBody" type="xs:string" minOccurs="0" />
      </xs:all>
    </xs:complexType>
  </xs:element>
</xs:schema>

根据此架构的有效 XML 文档将是:

<?xml version="1.0" encoding="utf-8" ?>
<MyDocument xmlns="http://tempuri.org/MySchema.xsd">
  <TextHeader>My header which is almost always the same...</TextHeader>
  <TextBody>My text body which is always different...</TextBody>
</MyDocument>

问题 1:有没有办法“包含”另一个文件中的 TextHeader 元素?

像这样:

文件“Header.xml”:

<?xml version="1.0" encoding="utf-8" ?>
<MyDocument xmlns="http://tempuri.org/MySchema.xsd">
  <TextHeader>My Header which is almost always the same...</TextHeader>
</MyDocument>

文件“CompleteDocument.xml”:

<?xml version="1.0" encoding="utf-8" ?>
<MyDocument xmlns="http://tempuri.org/MySchema.xsd">

  include "Header.xml" ???

  <TextBody>My text body which is always different...</TextBody>
</MyDocument>

问题 2:如果可能的话,.NET XMLSerializer 是否能够解析和理解包含此类“包含...”的文档?

提前感谢您的帮助!

【问题讨论】:

    标签: .net xml xsd xmlserializer


    【解决方案1】:

    对这两个问题都说不。您可以编写一些代码(例如 app.config 如何允许导入部分,或者 xslt 如何处理包含/导入),但这不是任何 XML 规范的内置代码,并且与现有架构不匹配。基本上,你必须自己做所有事情。

    如果您真的想走这条路,编写一个自定义 XmlReader 来识别特定元素(在特定 xmlns 中)并在此时静默合并 - 可能是最佳选择。

    【讨论】:

    • 我只是在搜索和试验XInclude(en.wikipedia.org/wiki/XInclude 和w3.org/TR/xinclude),但我没有得到这个工作。当我引用 XInclude 命名空间时,xi:include 元素无法识别(在 VS2008 中)。我想知道这是否只是一个从未被任何人实施过的 W3C“建议”。还是我解释 XInclude 的目的有误?
    • 最后我引入了我自己的“Include”元素并在没有 XmlSerializer 的情况下处理了整个 XML 文档。感谢您的提示!
    【解决方案2】:

    如果您可以修改架构,则可以使用XML entities。

    【讨论】:

    • 但这只是老式 DTD 的功能,不是 XSD 模式,不是吗?
    • 确实如此,但支持正是因为它是老式的。
    【解决方案3】:

    第一个问题的答案是肯定的。您可以执行 xInclude 以获取主文件中包含的内容 (http://www.w3.org/TR/xinclude/)

    【讨论】:

    • 没那么容易。 xinclude 是 w3c 建议,并未得到广泛实施。 (这可能是我没有让它工作的原因,请参阅我在接受的答案下的评论。)例如,没有浏览器支持它,并且在您必须依赖第三方工具和扩展的地方也没有 .NET 支持:@987654322 @
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多