【问题标题】:Is it possible to use wildcards with XInclude tags?是否可以在 XInclude 标签中使用通配符?
【发布时间】:2010-12-20 10:22:44
【问题描述】:

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

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

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

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

编辑:

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

【问题讨论】:

    标签: xml docbook xinclude


    【解决方案1】:

    XInclude 标签可以使用通配符吗?

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

    否则,可以通过说href="http://www.google.com/*" 之类的内容来镜像 Google 主页。

    提示:文件系统也没有任何通配符的概念。 贝壳可以。当他们解析路径并看到* 时,他们会为您完成填空的繁重工作。底层文件系统永远不会看到星号。

    【讨论】:

    • 当然,文件系统有文件系统的作者愿意加入的任何概念。例如,世界上使用最广泛的文件系统可能是 Windows 文件系统,它们确实定义了通配符通过 FindFirstFile 等。
    【解决方案2】:

    有一个快速的选项

    重写 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 会尝试验证它。

    【讨论】:

      【解决方案3】:

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

      您几乎可以肯定地使用 Norm Walsh 的 XProc implementation - calabash 之类的东西来做到这一点,但您需要以某种方式推出自己的 XInclude 等价物。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        相关资源
        最近更新 更多