2010-05-24 3 views
1

J'essaie d'analyser le contenu de l'aide http://feeds.feedburner.com/riabizXDocument.Parse(string) (car il se cache dans un DB.)XDocument.Parse échoue en raison d'une erreur de résolution, comment désactiver la résolution

Cependant, il échoue après avec la pile ci-dessous trace lorsqu'il essaie de résoudre certains URI dans ce XML. Je ne me soucie pas de la validation ou de tout ce non-sens XML, je veux juste la structure analysée. Comment puis-je utiliser XDocument sans cette résolution d'URI?

System.ArgumentException: The specified path is not of a legal form (empty). 
    at System.IO.Path.InsecureGetFullPath (System.String path) [0x00000] in 
:0 
    at System.IO.Path.GetFullPath (System.String path) [0x00000] in :0 
    at System.Xml.XmlResolver.ResolveUri (System.Uri baseUri, System.String 
relativeUri) [0x00000] in :0 
    at System.Xml.XmlUrlResolver.ResolveUri (System.Uri baseUri, System.String 
relativeUri) [0x00000] in :0 
    at Mono.Xml2.XmlTextReader.ReadStartTag() [0x00000] in :0 
    at Mono.Xml2.XmlTextReader.ReadContent() [0x00000] in :0 
    at Mono.Xml2.XmlTextReader.Read() [0x00000] in :0 
    at System.Xml.XmlTextReader.Read() [0x00000] in :0 
    at Mono.Xml.XmlFilterReader.Read() [0x00000] in :0 
    at Mono.Xml.XmlFilterReader.Read() [0x00000] in :0 
    at System.Xml.XmlReader.ReadEndElement() [0x00000] in :0 
    at System.Xml.Linq.XElement.LoadCore (System.Xml.XmlReader r, LoadOptions 
options) [0x00000] in :0 
    at System.Xml.Linq.XNode.ReadFrom (System.Xml.XmlReader r, LoadOptions 
options) [0x00000] in :0 
...

Répondre

3

Voilà comment j'arrête la résolution XML:

var r = new System.Xml.XmlTextReader(new StringReader(xml)); 
r.XmlResolver = new Resolver(); 

var doc = XDocument.Load(r); 

class Resolver : System.Xml.XmlResolver { 
    public override Uri ResolveUri (Uri baseUri, string relativeUri) 
    { 
     return baseUri; 
    } 
    public override object GetEntity (Uri absoluteUri, string role, Type type) 
    { 
     return null; 
    }  
    public override ICredentials Credentials { 
     set { 
     } 
    } 
} 

S'il vous plaît laissez-moi savoir si cela est correct.

2

Vous pouvez simplement effacer le XmlResolver:

r.XmlResolver = null; 

La méthode recommandée pour créer XmlReader utilise le XmlReader.Create() générique, dans ce cas:

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.XmlResolver = null; 
XmlReader r = XmlReader.Create(new StringReader(xml), settings);  

En utilisant .NET 4.0 ou vous pouvez aussi plus tard désactiver complètement le traitement des DTD (c'est de là que proviennent les URI):

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.DtdProcessing = DtdProcessing.Ignore; 
XmlReader r = XmlReader.Create(new StringReader(xml), settings);