2012-10-17 16 views
0

好吧,我是相當新的使用XML,XPath等工作Xml文檔添加命名空間uri,是否有可能將dtd作爲本地文件與網頁驗證?

我正在寫一個窗口服務,將從隊列中獲取信息。它會處理這些信息,並且這些信息的一部分處理是在我創建的xmldocument上使用xpath而不是加載。

代碼片段。 :我那麼做了一些XPath的功能

XmlDocument _xmlDocument = new XmlDocument(); 
_xmlDocument.Load(svgFile); 
_xmlNamespaceManager = new XmlNamespaceManager(_xmlDocument.NameTable); 
_xmlNamespaceManager.AddNamespace("svg", "http://www.w3.org/2000/svg"); 

上面的代碼後,我需要的是有一些預先寫好的功能,將節省了我大量的時間來使用。

這裏是真正的問題,當我使用上面的AddNamespace時,它將出現在該uri上,並且花費太多時間(驗證等)。我的想法是,如果我可以下載DTD並創建一個本地文件,它可以節省那些浪費在網絡上的時間。不幸的是,沒有AddNamespace xpath將無法工作。

我在網上研究了這個,並且一直沒能找到解決方案。 xml是內部創建的,所以我現在不擔心從web上獲取最新的模式。我更擔心及時生成服務中的數據。也許我完全錯了,這是不可能的,但從編程角度來說,我不知道這是如何沒有做過。

回答

0

我最後不得不創建自己的XmlResolver類,然後下載DTD和一堆與它相關的本地文件的MOD。然後,而不是做一個xmldocument.load,你執行如下所示。 :

  XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.ValidationType = ValidationType.DTD; 
      settings.ProhibitDtd = false; 
      settings.XmlResolver = new MyCoolResolver(); 
      binDirectory = binDirectory + "/content"; 
      string myFileLocation = binDirectory + "/MyFile.svg"; 

      using (XmlReader reader = XmlReader.Create(myFileLocation , settings)) 
      { 
       try 
       { 
        while (reader.Read()) 
        { 
         _xmlDocument.Load(reader); 
        } 
       } 
       catch (XmlException e) 
       { 
        Console.WriteLine(e.Message); 
       } 
      } 

然後你的類就像你的myXmlResolver類一樣。

namespace ReallyCoolProject 
{ 
    public class MyCoolResolver : XmlUrlResolver 
    { 
     public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) 
     { 
      string binDirectory =    Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); 
      binDirectory = binDirectory + "/mods"; 

      if (absoluteUri.OriginalString.Contains("-//W3C//DTD SVG 1.1//EN")) 
      { 
       return File.Open(binDirectory + "/svg11.dtd", FileMode.Open); 
      } 

      if (absoluteUri.OriginalString.Contains("-//W3C//ENTITIES SVG 1.1 Document Model//EN")) 
      { 
       return File.Open(binDirectory + "/svg11-model.mod", FileMode.Open); 
     } 

     //.....many many more mod files than this 

    } 
    } 
} 

* *個人筆記不能把所有的功勞,因爲我把點點滴滴從一堆在網絡上的例子。

0

它應該工作正常使用本地文件:

注:URI是不使用解析器的命名空間來查找 信息。

其目的是給命名空間一個唯一的名稱。但是,公司經常使用名稱空間作爲指向包含 名稱空間信息的網頁的指針。

來源: About Xml namespaces

相關問題