2012-08-09 65 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()