2011-06-24 99 views
1

我使用的是下面的文件結構簡單的XmlReader:問題在ASP.NET讀取XML文件

<application> 
    <nodetitle permission="perm1">Some Dept</nodetitle> 
    <project>Project A</project> 
    <links> 
     <link> 
      <pagename>page1.aspx</pagename> 
     </link> 
     <link> 
      <pagename permission="perm2">page2.aspx</pagename> 
     </link> 
     <link> 
      <pagename>page3.aspx</pagename> 
     </link> 
    </links> 
</application> 

我在XML API生鏽,我的問題是閱讀的兄弟<鏈接>元素在一次通過 - 我的本能是看看創建某種內部循環?

while (reader.Read()) 
{ 
    ... 

    if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "links")) 
    { 
     // read all <link> elements in a single pass 
    } 
    ... 
} 

更新 - 2011年6月25日

我要去嘗試,併成爲一個更具體一點。我沒有使用XPath。使用XmlReader 或Linq to Xml(我完全不熟悉這個),我想要一種方法來提取鏈接元素和屬性並檢查它們的值。

+0

屬性的擴展超出你有什麼不想任何理由只是使用xpath來選擇你想要的節點?使用XmlReader似乎更困難。 – rsbarro

+0

我想不是,以前從未使用過。我希望能夠提取每個鏈接的所有信息(atts&values),然後繼續進行主while循環的下一次迭代 - 歡迎使用代碼示例:) – IrishChieftain

+0

我看了一下Api並找到了讀取子樹的方法,方法是reader.ReadSubtree。它返回給你一個XmlReader對象的實例 –

回答

3

那麼,如果你使用一個XML文檔,你可以做這樣的事情:

XmlNodeList nodeList = xmlDocument 
    .DocumentElement.SelectNodes("//application/links/link"); 

foreach (XmlNode node in nodeList) { 
    ... 
} 

在循環剛剛得到的內部<pageName>元素和讀取屬性和/或文本。

也就是說,XPath比閱讀器或完整的Xml文檔更容易,更快速和更有效率。由於您可以在分析樹上使用Linq語法,因此Linq2XML也非常適合使用。

編輯:

我感到提的XmlDocument那種髒,所以我創建了一個簡單Linq2Xml例子來說明你想多麼容易,這甚至省略任何Linq的語法,以防萬一去了:

string path = @"C:\path\to\my\xmlfile.xml"; 
XDocument doc = XDocument.Load(path, LoadOptions.None); 

var nodes = doc.Root.Element("links").Elements("link"); 
foreach (var node in nodes) { 
    var pageNameElement = node.Element("pagename"); 
    XAttribute permAttribute = pageNameElement.Attribute("permission"); 
    string permission = ""; 
    if (permAttribute != null) 
     permission = permAttribute.Value; 
    string text = pageNameElement.Value; 
    // Do something with the values... 
} 

你當然可以用流來初始化XDocument,如果這就是你已經擁有的。希望這有助於:)

+0

現在通過這個工作,隨時提供任何Linq語法:) – IrishChieftain

+1

您的第二次編輯的代碼示例工作,謝謝:-) – IrishChieftain

4

的LINQ to XML使得這個東西瘋狂容易醬:

XDocument doc = XDocument.Parse("xml here or use .Load()"); 
var links = doc.Descendants("link"); 

你可以從這裏單獨讀屬性(XAttribute)關閉XNode或再次使用LINQ來獲取所有所有節點等等等等

+0

從未使用LINQ to XML,是否有可能查詢而不使用XDocument?尋找與此場景相關的鏈接... – IrishChieftain

+0

您可以使用靜態XNode.ReadFrom方法從XNode級別開始,該方法將XmlReader作爲參數並將XML片段作爲XNode返回。如果你還沒有它,我強烈建議下載LINQPAD(http://www.linqpad.com),加載你的XML並探索API。 –

+0

Daz,你可以給我的語法或文檔鏈接,挖掘元素和屬性?謝謝 :) – IrishChieftain