如何在一个XML文件中“包含”另一个XML文件?

5

我有一个 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是否能够解析和理解包含“include...”的文档?

提前感谢您的帮助!

3个回答

3
不对这两个问题做出回答。您可以编写一些代码(比如app.config允许导入节,或者xslt处理包含/导入的方式),但这不是内置在任何XML规范中的,并且不符合现有的模式。基本上,您必须自己完成所有工作。
如果您真的想走这条路,编写一个自定义的XmlReader,识别特定元素(在特定xmlns中)并在该点默默地合并 - 或许是最好的选择。

我只是在搜索和尝试使用XInclude(http://en.wikipedia.org/wiki/XInclude和http://www.w3.org/TR/xinclude/)但我没有成功。当我引用XInclude命名空间时,`xi:include`元素无法被识别(在VS2008中)。我想知道这是否只是W3C的“建议”,从未被任何人实现。或者我可能对XInclude的目的有误解? - Slauma
最后,我成功引入了自己的“Include”元素,并在不使用XmlSerializer的情况下处理了整个XML文档。感谢您的提示! - Slauma

0

这并不容易。xinclude是w3c的推荐,但并没有被广泛实现。(这可能就是为什么我没能让它工作,可以看看我在被接受的答案下的评论。)例如,没有浏览器支持它,在.NET中也没有可用的支持,你必须依赖第三方工具和扩展:https://dev59.com/_W7Xa4cB1Zd3GeqPoVDd - Slauma

0

如果您可以修改模式,您可能可以使用XML实体


但这只是针对老式DTD的一个功能,不适用于XSD模式,是吗? - Slauma
确实如此,但它之所以得到支持,正是因为它是老式的。 - Anton Tykhyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接