1

恐怕这是不可能的,但也没有找到任何地方说不可能。

我想使用通配符在 XML 文档中包含一组文件。像这样:

<?xml version="1.0" encoding="utf-8"?>
<mydocument>
  <!-- ... -->
  <xi:include href="*include.xml"/>
</mydocument>

我知道它不起作用,但我认为它清楚地表达了我的意图。有没有办法做到这一点?

编辑:

我尝试使用xpointer属性,但无法使其工作。

4

3 回答 3

3

是否可以使用带有 XInclude 标签的通配符?

不。href表示 URI,它们没有通配符的概念。

否则,可以通过说类似href="http://www.google.com/*".

提示:文件系统也没有任何通配符的概念。贝壳可以。当他们解析路径并看到*. 底层文件系统永远不会看到星号。

于 2010-12-20T10:36:31.500 回答
1

有一个快速选项

覆盖 XmlResolver 以创建通配符感知解析器:

class WildCardResolver : XmlUrlResolver
{
    public override Uri ResolveUri(Uri baseUri, string relativeUri)
    {
        try
        {
            DirectoryInfo di = new DirectoryInfo(baseUri.AbsolutePath); // TODO Check it is valid.
            string combinedFilePath = Path.GetTempFileName();
            using (FileStream combinedStream = new FileStream(combinedFilePath, FileMode.OpenOrCreate))
            {
                foreach (FileInfo fi in di.GetFiles(relativeUri))
                {
                    using (FileStream fileStream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read))
                    {
                        fileStream.CopyTo(combinedStream);
                    }
                }
            }
            Uri absUri = new Uri(combinedFilePath);
            return absUri;
        }
        catch(Exception ex)
        {
            //Log Exception
            return base.ResolveUri(baseUri, relativeUri);
        }
    }
}

如果通配符完全适用,有很多事情需要注意

此外,BaseURI 可能很棘手,因为可以说源 XML 来自

file://c:/myXMLRepository/myXML.xml

包括 *inc.xml

现在基本 URI 是 file//c:/temp/tmpA0.tmp

.

.

祝你好运,

编辑:

还有另一种方法可以覆盖

public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)

但还有其他问题……因为绝对 URI 并不总是有效的,XIncludingReader 会尝试验证它。

于 2012-03-22T09:02:31.037 回答
0

@Tomalek 绝对就在这里。有很多方法可以做你想做的事情,但 XInclude 不是正确的答案。您将需要某种可以为您处理通配符扩展的工具。

您几乎可以肯定使用 Norm Walsh 的XProc 实现之类的东西来做到这一点 - 葫芦,但您需要以某种方式滚动您自己的 XInclude 等价物。

于 2010-12-22T12:24:51.440 回答