2012-08-09 63 views
0

我有一個通過從一個字文檔解析XML創建的XElement對象找到的節點。我想要做的就是找到並刪除,我試圖找到使用LINQ特定的節點。的XElement除去使用LINQ

的XML是幾百線長,所以我不想在這裏發佈整個事情,我會只顯示前20行:

<w:body xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
    <w:p w:rsidR="00CB3A3E" w:rsidP="00257CF7" w:rsidRDefault="008C1E91"> 
     <w:pPr> 
      <w:pStyle w:val="Heading-Title" /> 
     </w:pPr> 
     <w:r> 
      <w:t>References</w:t> 
     </w:r> 
    </w:p> 
    <w:sdt> 
     <w:sdtPr> 
      <w:alias w:val="Client" /> 
      <w:tag w:val="ClientName" /> 
      <w:id w:val="-1008363323" /> 
      <w:lock w:val="contentLocked" /> 
      <w:placeholder> 
       <w:docPart w:val="DefaultPlaceholder_1082065158" /> 
      </w:placeholder> 
      <w:dataBinding w:xpath="/project[1]/ClientName[3]" w:storeItemID="{1BDA6E50-A0B2-47FF-9929-1F045B6CF8AD}" /> 
      <w:text /> 

我想刪除的節點是:<w:t>References</w:t> 。我目前得到一個「Sequence contains no elements"例外。newBody是的XElement。

newBody.Descendants.Where(Function(e) e.Name.Equals("<w:t>") AndAlso e.Value.Equals("References")).First().Remove() 

正如我所說的,我得到上面提到的例外。這是我應該如何試圖得到這個節點?有沒有更好的辦法?爲什麼我的查詢沒有得到指定的節點?關於如何更好地實現這一點的建議非常感謝,我仍然試圖學習在.net和LINQ本身中遍歷XML的最佳實踐。

回答

1

我在這裏做一些猜測,因爲這是VB.net,我來自C#背景,但LINQ部分看起來是一樣的,我認爲你的問題在於Name.Equals("<w:t>")部分Name不是字符串而是一個XName,它有幾個屬性。最有可能你需要看看Name.LocalName.Equals("t")

.Where(Function(e) e.Name.LocalName.Equals("t")) AndAlso e.Value.Equals("References")) 

至於你的問題的第二部分,如果你只是想刪除一個節點,然後導航到一個特定的節點是最有可能比製作一個更加高效記錄只有一個節點匹配的全局規則。我的方法對你的問題會更喜歡這樣的:

newBody.Element("p").Element("r").Element("t").Remove(); 
+0

非常感謝您的建議和信息。我發現它非常有用。我相信我會簡單地導航到節點而不是使用LINQ。再次感謝! – TheMethod 2012-08-09 12:17:50

+1

不客氣,我很高興你設法解決這個問題。 – Bazzz 2012-08-09 12:42:37

0

你已經有一個有效的解決方案忽略了命名空間,但LINQ到XML具有訪問元素的命名空間,所以我會告訴你的是,你有兩個選項的支持:

Dim w As XNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" 
    newBody.Descendants(w + "t").First(Function(t) t.Value = "References").Remove() 



' In Imports section 
    Imports <xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
    ' In code 
    newBody...<w:t>.First(Function(t) t.Value = "References").Remove()