是否可以将通配符与XInclude标记一起使用?

时间:2010-12-20 10:22:44

标签: xml docbook xinclude

我担心这是不可能的,但是在任何地方都没有发现它也是不可能的。

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

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

我知道它不起作用,但我认为它清楚地表达了我的意图。有没有办法实现这个目标?

修改

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

3 个答案:

答案 0 :(得分:3)

  

是否可以将通配符与XInclude标记一起使用?

没有。 href表示URI,这些没有通配符的概念。

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

之类的内容来镜像Google主页

提示:文件系统也没有任何通配符概念。 贝壳做。当他们解析路径并看到*时,他们会为您填补空白。底层文件系统永远不会看到星号。

答案 1 :(得分: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来自

文件:// C:/myXMLRepository/myXML.xml

包括* inc.xml

现在基URI是文件// c:/temp/tmpA0.tmp

祝你好运,

编辑:

另一种覆盖方式

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

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

答案 2 :(得分:0)

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

你几乎可以肯定地使用像Norm Walsh XProc implementation - calabash这样的东西,但你需要以某种方式将自己的等价物推到XInclude。