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

Xml 是否可以将通配符与XInclude标记一起使用?,xml,docbook,xinclude,Xml,Docbook,Xinclude,恐怕这是不可能的,但我也没有找到任何据说不可能的地方 我希望使用通配符在XML文档中包含一组文件。像这样: <?xml version="1.0" encoding="utf-8"?> <mydocument> <!-- ... --> <xi:include href="*include.xml"/> </mydocument> 我知道它不起作用,但我认为它清楚地表达了我的意图。有没有办法做到这一点 编辑: 我尝试使用xpo

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

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

<?xml version="1.0" encoding="utf-8"?>
<mydocument>
  <!-- ... -->
  <xi:include href="*include.xml"/>
</mydocument>
我知道它不起作用,但我认为它清楚地表达了我的意图。有没有办法做到这一点

编辑:

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

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

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

否则,可以通过说href之类的话来镜像谷歌主页=http://www.google.com/*

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

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

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

否则,可以通过说href之类的话来镜像谷歌主页=http://www.google.com/*


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

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


几乎可以肯定的是,你可以用诺姆·沃尔什(Norm Walsh)这样的东西来实现这一点,但你需要以某种方式将你自己的等价物推出XInclude。

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


几乎可以肯定的是,你可以用诺姆·沃尔什(Norm Walsh)这样的东西来实现这一点,但你需要以某种方式将自己的等价物推广到XInclude。

有一个快速选项

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

有一个快速选项

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