我们可以将XML文件导入另一个XML文件吗?
我的意思是XML中有任何导入标记,它将XML路径作为参数并导入XML(为其提供路径)。
答案 0 :(得分:86)
你声明这样的实体:
<!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? p>
人们可能会问的第一个问题是“为什么使用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)
此功能称为XML Inclusions (XInclude)。一些例子:
答案 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>