2012-01-12 27 views
0

我在c#中使用xmlreader解析xml字符串,但是當我解析時,我有時需要獲取節點的完整內容,包括帶標記的子節點,並且仍然能夠繼續解析。用xmlreader和C獲取字符串的孩子#

ReadInnerXML和ReadOutterXML分手了我的一切

例如XML:

<?xml version="1.0" standalone="yes"?> 
<main> 
    <parse1> //finding this will get full inner or outter xml - either one - my issue 
     <parse2 /> // even getting the children above might still need parse chldren 
     <negligeable /> // not all children interest me 
    </parse1> 
    <parse3>some text</parse3> // not all children of main are the same but all need be parsed 
</main> 

希望這給你,我現在可以解析2和3的是什麼,我需要

總體思路和忽略我不需要的東西,但是如果我在使用ReadInnerXML或ReadOutterXML時發現標籤,那麼它不會讓我解析其他任何東西 - 甚至不在外面的標籤。

ReadInnerXML和ReadOutterXML做回我正常需要的文本,但導致一切不被解析

編輯:按dasblinkenlight sugestion,一些代碼:

using (XmlReader reader = XmlReader.Create(new StringReader(XmlString))) 
{ 
    while (reader.Read()) 
    { 
     switch (reader.NodeType) 
     { 
      case XmlNodeType.Element: 
       switch (reader.Name) 
       { 
        case "parse1": 
         Console.WriteLine("Contents of Parse 1: {0}", ?function here?); 
         break; 
        case "parse2": 
         Console.WriteLine("Parse 2 tag exists"); 
         break; 
        case "parse3": 
         Console.WriteLine("Contents of Parse 3: {0}", Reader.ReadElementContentAsString()); 
         break; 
       } 
       break; 
     } 
    } 
} 

結果應該是(給予測試XML)

Contents of Parse 1: <parse2 /><negligeable /> 
Parse 2 tag exists 
Contents of Parse 3: some text 

我也試圖ReadSubTree

任何提示?

+0

這是很難搞清楚是什麼問題,沒有看到你的代碼。你可以在你的問題中添加一些C#來說明問題嗎? – dasblinkenlight 2012-01-12 15:26:14

+0

好的,但問題不在於代碼,但我問的是 - 基本上迭代兩次相同的節點 - 我將很快添加代碼示例 – 537mfb 2012-01-12 16:00:53

+0

如果我正確理解你,'ReadSubtree'不會幫助,因爲它定位原讀者在它被調用的元素的末尾。它所做的只是提供一個「密封的」閱讀器,它只能看到這個元素。但我應該補充一點,我不太明白你想要做什麼。如果可能,請澄清你的問題。 – harpo 2012-01-12 16:13:22

回答

1

基本上readinnerxml正在讀取到最後,XmlReader只是向前。 你可能逃脫的XmlDocument,或另一種方式,是創建從相同的XML內容另一位讀者,讀給你的原單,其中,讓您的字符串和斌的「複製」

+0

明天我將查看xmldocument(幾乎在這裏結束)。你的第二次消化是基本上我今天一直在努力實現的,但是我會知道原來我在哪裏?記住我的例子是一個簡單的例子,我可以有n 標籤解析。 – 537mfb 2012-01-12 18:27:51

+0

只是讀我自己的話有一個想法 - 一個標籤計數器 - 然後只是在副本上跳過n個標籤 - 明天就會試試,除非有人在這裏提出更好的解決方案 – 537mfb 2012-01-12 18:28:55

+0

「基本上readinnerxml正在讀取所有的方式結束「 - 這就是我所看到的 - 儘管它只返回 – 537mfb 2012-01-12 18:30:15

1

使用XmlDocument可以通過你的XML元素和打印你想要

例如東西容易循環:

XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.Load(XmlString); 

string parse1_Content = xmlDocument.GetElementsByTagName("parse1")[0].InnerXml; 
Console.WriteLine("Contents of Parse 1: " + parse1_Content); 

if(xmlDocument.GetElementsByTagName("parse2") > 0) 
    Console.WriteLine("Parse 2 exists"); 

string parse3_Content = xmlDocument.GetElementsByTagName("parse1")[0].InnerText; 
Console.WriteLine(parse3_Content); 
+0

我嘗試過這種方法,因爲,只有它不會工作在更復雜的例子 - 例如,如果有2個parse1元素,只有一個有parse2元素它總是會打印解析2存在,我不會知道它將解析1元素它將駐留 – 537mfb 2012-01-13 10:36:04

+1

.GetElementByTagName返回給你一個元素列表,如果'Parse2'存在,你可以在打印前檢查元素父名稱,或者檢查if 'Parse1'具有名爲'Parse2'的子節點。 另外我建議你看到的文檔,我認爲有很多方法,可以爲你有所幫助 – 2012-01-13 11:39:14

+0

我會研究它以防萬一 - 但正如我在託尼回答說,我通過另一種方法解決了這個問題 - 不完美,但在最初的測試中爲我工作 - upvoted您的評論 – 537mfb 2012-01-13 18:09:39