我们可以将XML文件导入另一个XML文件吗?

时间:2011-02-25 18:21:49

标签: xml file import merge

我们可以将XML文件导入另一个XML文件吗?

我的意思是XML中有任何导入标记,它将XML路径作为参数并导入XML(为其提供路径)。

4 个答案:

答案 0 :(得分:86)

您可以使用external (parsed) general entity

你声明这样的实体:

<!ENTITY otherFile SYSTEM "otherFile.xml">

然后你这样引用它:

&otherFile;

一个完整的例子:

<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
  <foo>
    <bar>&otherFile;</bar>
  </foo>
</doc>

当XML解析器读取文件时,它将扩展实体引用并将引用的XML文件包含在内容中。

如果“otherFile.xml”包含:<baz>this is my content</baz>

然后XML将被XML解析器评估并“看到”:

<?xml version="1.0" standalone="no" ?>
<doc>
  <foo>
    <bar><baz>this is my content</baz></bar>
  </foo>
</doc>

一些可能有用的参考资料:

答案 1 :(得分:20)

其他答案涵盖了两种最常见的方法,Xinclude和XML外部实体。微软有一个非常好的文章,说明为什么人们应该更喜欢Xinclude,以及几个示例实现。我引用了下面的比较:

http://msdn.microsoft.com/en-us/library/aa302291.aspx

  

为什么XInclude?      

人们可能会问的第一个问题是“为什么使用XInclude而不是XML   外部实体?“答案是XML外部实体有一个   一些众所周知的限制和不便的影响,其中   有效地防止它们成为通用包含物   设施。具体做法是:

     
      
  • XML外部实体不能是一个完整的独立XML文档 - 既不是独立的XML声明也不是Doctype声明   允许。这实际上意味着XML外部实体本身不能   包括其他外部实体。
  •   
  • XML外部实体必须是格式良好的XML(乍一看并不是那么糟糕,但想象一下,您希望将示例C#代码包含在XML中   文件)。
  •   
  • 无法加载外部实体是一个致命的错误;任何恢复都是严格禁止的。
  •   
  • 可能只包括整个外部实体,无法仅包含文档的一部分。    - 必须在DTD或内部子集中声明外部实体。这打开了一个充满影响的潘多拉盒子,例如事实   必须在Doctype声明中指定document元素   验证读者可能需要完整的内容模型   文件在DTD中定义。
  •   
     

使用XML外部实体作为包含的缺陷   机制已经知道了一段时间,实际上产生了   于1999年向W3C提交XML包含提案   微软和IBM。该提案定义了处理模型和语法   用于通用XML包含工具。

     

四年后,XML Inclusions的版本1.0,也被称为   Xinclude,是候选推荐标准,意思是W3C   认为它已被广泛审查并满足基本要求   它打算解决的技术问题,但尚未完整   建议。

另一个提供各种示例实现的好网站是https://www.xml.com/pub/a/2002/07/31/xinclude.html。以下是其网站的常见用例示例:     

<book xmlns:xi="http://www.w3.org/2001/XInclude">

  <title>The Wit and Wisdom of George W. Bush</title>

  <xi:include href="malapropisms.xml"/>

  <xi:include href="mispronunciations.xml"/>

  <xi:include href="madeupwords.xml"/>

</book>

答案 2 :(得分:12)

答案 3 :(得分:0)

Mads Hansen的解决方案很好但是要成功阅读.NET 4中的外部文件需要一些时间来弄清楚有关解析器,ProhibitDTD等的评论中的提示。

这就是它的完成方式:

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.DtdProcessing = DtdProcessing.Parse;
        XmlUrlResolver resolver = new XmlUrlResolver();
        resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
        settings.XmlResolver = resolver;
        var reader = XmlReader.Create("logfile.xml", settings);
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        foreach (XmlElement element in doc.SelectNodes("//event"))
        {
            var ch = element.ChildNodes;
            var count = ch.Count;
        }

logfile.xml:

<?xml version="1.0"?>
<!DOCTYPE logfile [
<!ENTITY events    
 SYSTEM "events.txt">
]>
<logfile>
&events;
</logfile>

events.txt:

<event>
    <item1>item1</item1>
    <item2>item2</item2>
</event>