XDocument.Parse не удается из-за ошибки разрешения, как отключить разрешение - PullRequest
1 голос
/ 24 мая 2010

Я пытаюсь проанализировать содержимое http://feeds.feedburner.com/riabiz, используя XDocument.Parse(string) (потому что он кэшируется в БД.)

Однако при попытке выполнить следующую трассировку стека происходит сбой при попыткечтобы разрешить некоторые URI в этом XML.

Меня не волнует проверка или какая-то ерунда XML, я просто хочу проанализировать структуру.Как я могу использовать XDocument без этого разрешения 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 
... 

Ответы [ 2 ]

3 голосов
/ 24 мая 2010

Вот как я останавливаю разрешение 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 {
        }
    }
}

Пожалуйста, дайте мне знать, если это правильно.

2 голосов
/ 05 октября 2012

Вы можете просто очистить XmlResolver:

r.XmlResolver = null;

Рекомендованный способ создания XmlReader использует универсальный XmlReader.Create(), в таком случае:

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

Используя .NET 4.0 или более позднюю версию, вы также можете полностью отключить обработку DTD (отсюда и URI):

XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Ignore;
XmlReader r = XmlReader.Create(new StringReader(xml), settings);      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...