2009-10-26 44 views
2

這是我的代碼,我不知道爲什麼我無法通過XPathNavigator讀取數據。但是在我添加命名空間和模式之前就已經完成了。無法通過XPathNavigator讀取xml

  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 2009-10-26 07:53:34

+0

文檔是否符合給定的模式?它是什麼不起作用?任何例外? – 2009-10-26 07:59:34

+0

select返回無結果。 – Roy 2009-10-26 08:18:32

回答

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 2009-10-26 08:22:50

+0

它以這種方式工作,因爲xml節點始終是某些名稱空間的一部分,當導航器運行搜索時它會過濾名稱空間。有一種方法可以設置默認命名空間,但現在我不記得它了(但它比在XmlNamespaceManager中將名稱空間名稱設置爲string.Empty更復雜) – Elisha 2009-10-26 08:31:26