我们可以将一个XML文件导入另一个XML文件吗?
我的意思是说,XML中是否有任何导入标记,它将XML路径作为参数并导入XML(为其提供了路径)。
Answers:
您可以这样声明实体:
<!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>
一些参考可能会有所帮助:
XMLResolver
属性设置为什么。如果未在XMLDocument对象上设置XMLResolver属性,则它可能不会加载外部资源。msdn.microsoft.com/en-us/library/5fcwybb2.aspx
其他答案涵盖两种最常见的方法,即Xinclude和XML外部实体。对于为什么要使用Xinclude以及一些示例实现,Microsoft撰写了非常好的文章。我引用了下面的比较:
每个http://msdn.microsoft.com/en-us/library/aa302291.aspx
为什么使用XInclude?
一个人可能会问的第一个问题是:“为什么使用XInclude而不是XML外部实体?” 答案是XML外部实体具有许多众所周知的局限性和不便的含义,这有效地阻止了它们成为通用包含工具。特别:
- XML外部实体不能是成熟的独立XML文档-不允许独立XML声明或Doctype声明。这实际上意味着XML外部实体本身不能包含其他外部实体。
- XML外部实体必须是格式良好的XML(乍看之下还不错,但是假设您想将示例C#代码包含在XML文档中)。
- 无法加载外部实体是致命错误;严禁任何恢复。
- 可能只包括整个外部实体,而没有办法只包含文档的一部分。-外部实体必须在DTD或内部子集中声明。这就打开了一个充满含义的潘多拉魔盒,例如必须在Doctype声明中命名文档元素,并且验证读者可能需要在DTD中定义文档的完整内容模型。
使用XML外部实体作为包含机制的缺陷已经有一段时间了,并且实际上催生了Microsoft和IBM在1999年向W3C提交XML包含提案的过程。该提案定义了通用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>
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>