2009-10-26 2 views
2

Вот мой код, я не знаю, почему я не могу прочитать данные через XPathNavigator. Но это было хорошо, прежде чем я добавил пространство имен и схему.Не могу прочитать xml через XPathNavigator

  XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.Schemas.Add("http://www.somewhere.com", schemaPath); 
     settings.ValidationType = ValidationType.Schema; 

     XmlReader reader = XmlReader.Create(xmlPath, settings); 

     XPathDocument doc = new XPathDocument(reader); 

     XPathNavigator nav = doc.CreateNavigator(); 
     XPathNodeIterator iter = nav.Select("/feeds/feed"); 

     while (iter.MoveNext()) 
     { 
      XPathNavigator feed = iter.Current.SelectSingleNode("name"); 
      string name = feed.Value; 
      feed = iter.Current.SelectSingleNode("url"); 
      string url = feed.Value; 
      feed = iter.Current.SelectSingleNode("url/@ver"); 
      string version = feed.Value; 
      Console.WriteLine(name + ":" + url + ":" + version);} 

XML-:

<?xml version="1.0" encoding="utf-8"?> 
<feeds xmlns="http://www.somewhere.com"> 
    <feed> 
    <name>asdf</name> 
    <url ver="1.0">http://blogs.msdn.com/asdf/rss.xml</url> 
    </feed> 
    <feed> 
    <name>asdf 2</name> 
    <url ver="2.0">http://blogs.msdn.com/asdf2/rss.xml</url> 
    </feed> 
</feeds> 

и схема:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema 
    targetNamespace="http://www.somewhere.com" 
    elementFormDefault="qualified" 
    xmlns="http://www.somewhere.com" 
    xmlns:mstns="http://www.somewhere.com" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="feeds"> 
    <xs:complexType > 
     <xs:sequence > 
     <xs:element name="feed" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="name" type="xs:string"/> 
       <xs:element name="url"> 
       <xs:complexType > 
        <xs:simpleContent> 
        <xs:extension base="xs:string"> 
         <xs:attribute name="ver" type="xs:string" /> 
        </xs:extension> 
        </xs:simpleContent> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

Я не могу опубликовать XML, я не знаю почему. Простите за это. – Roy

+0

Соответствует ли документ данной схеме? Что это не работает? Любые исключения? –

+0

выбор не возвращает результат. – Roy

ответ

6

Вы можете добавить пространство имен в XPath:

var xPathNavigator = doc .CreateNavigator(); 
var xmlNamespaceManager = new XmlNamespaceManager(xPathNavigator.NameTable); 
xmlNamespaceManager.AddNamespace("x", "http://www.somewhere.com"); 
xPathNavigator.Select("/x:feeds/x:feed", xmlNamespaceManager); 
+0

Спасибо, ваше решение работает. Но почему? И как просто это. Я не хочу добавлять пространство имен каждый раз. – Roy

+0

Это работает так, поскольку узел xml всегда является частью некоторого пространства имен, когда навигатор запускает поиск, он фильтрует пространства имен. Существует способ установить пространство имен по умолчанию, но я не могу его сейчас вспомнить (но это сложнее, чем указать имя пространства имен string.Empty в XmlNamespaceManager) – Elisha