2010-12-20 77 views
1

恐怕這是不可能的,但在任何地方都沒有發現它被認爲是不可能的。是否可以使用帶有XInclude標籤的通配符?

我想使用通配符在XML文檔中包含一組文件。像這樣:

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

我知道它不起作用,但我認爲它清楚地表達了我的意圖。有沒有辦法做到這一點?

編輯:

我試圖用xpointer屬性,但不能使它工作。

回答

3

是否有可能使用帶XInclude標籤的通配符?

不可以href表示一個URI,它們沒有通配符的概念。

否則,可以通過說出諸如href="http://www.google.com/*"之類的內容來鏡像Google主頁。

提示:文件系統也沒有任何通配符的概念。 做。當他們解析路徑並看到一個*時,他們會爲你填充空白。底層文件系統永遠不會看到星號。

0

@Tomalek絕對就在這裏。有辦法做你想做的事情,但XInclude不是正確的答案。您將需要某種可以爲您處理通配符擴展的工具。

你幾乎可以肯定地用Norm Walsh的XProc implementation - calabash這樣的東西來做到這一點,但是你需要以某種方式將你自己的等價物轉換爲XInclude。

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是文件// C:/temp/tmpA0.tmp

祝你好運,

編輯:

那裏有另一個方法來覆蓋

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

但也有通過實行其他問題......因爲絕對URI不會永遠是有效的,並且XIncludingReader嘗試並驗證它。

相關問題