2015-05-19 80 views
0

我有一個看起來有點像這樣的XML文檔:查找和數量的連續XML元素

<root> 
    Maybe some text 
    <thing>thing can have text</thing> 
    <thing>it can even be on multiple 
    lines 
    </thing> 
    <thing>a third thing</thing> 
    This text resets the numbering 
    <thing>this thing is not part of the above list and should have number 1</thing> 
    <some-element-not-thing>Also resets numbering</some-element-not-thing> 
    <thing>this thing should also have number 1<thing/> 
</root> 

我需要數點<thing>時候,他們來連續,通過給每個被稱爲「數字」的屬性。也就是說,我期望的結果是:

<root> 
    Maybe some text 
    <thing number="1">thing can have text</thing> 
    <thing number="2">it can even be on multiple 
    lines 
    </thing> 
    <thing number="3">a third thing</thing> 
    This text resets the numbering 
    <thing number="1">this thing is not part of the above list and should have number 1</thing> 
    <some-element-not-thing>Also resets numbering</some-element-not-thing> 
    <thing number="1">this thing should also have number 1<thing/> 
</root> 

我該如何處理這樣的事情?我看不到在XmlDocument中的元素之間查找文本的方法(但它確實讓我按順序枚舉元素,所以當遇到不是<thing>的東西時,我可以重置編號),並且我不確定LINQ to XML是否允許我在元素之間獲取文本,因爲它只會產生元素或後代,而這兩者都不代表「鬆散文本」。 也許這個「鬆散的文本」是壞的(但顯然可以解析)XML?

編輯:我完全誤解了我自己的問題。顯然,元素之間沒有文本,這是我之後修正的錯誤的結果。我最終使用的解決方案只是枚舉節點並以這種方式改變它們的屬性(使用XML文檔並忽略空白),類似於下面的建議。我很抱歉沒有把這個問題轉到我的頭上,或者花費更多的時間進行研究。如果人們認爲這個問題沒有足夠的貢獻,我不會介意刪除它。

+0

爲什麼要使用'XmlDocument'任何理由嗎?除非我有一個非常好的理由,否則我總是使用LINQ to XML。 –

+0

這看起來好像不是全部有效的XML。 –

+3

請不要只是要求我們爲您解決問題。告訴我們你是如何試圖自己解決問題的,然後向我們展示結果是什麼,並告訴我們爲什麼你覺得它不起作用。請參閱「[您嘗試過什麼?](http://whathaveyoutried.com/)」,以獲得一篇您最近需要閱讀的優秀文章。 –

回答

1

與往常一樣,如果您在提問之前提供了您已經嘗試過的內容,將會有所幫助。有很多博客帖子和有關解析和操作XML的問題。

首先,我會解析使用LINQ to XML。然後,您只需循環遍歷根元素下的節點,爲每個元素分配一個遞增的數字。此計數器復位時,下一個元素是不是thing而不是空白:

var doc = XDocument.Parse(xml, LoadOptions.PreserveWhitespace); 

var i = 0; 

foreach (var node in doc.Root.Nodes()) 
{ 
    var element = node as XElement; 
    var text = node as XText; 

    var isThing = element != null && element.Name == "thing"; 
    var isWhitespace = text != null && string.IsNullOrWhiteSpace(text.Value); 

    if (isThing) 
    { 
     element.Add(new XAttribute("number", ++i)); 
    } 
    else if (!isWhitespace) 
    { 
     i = 0; 
    } 
} 

var result = doc.ToString();