我有一个XElement对象,它是通过从word文档解析XML而创建的。我想要做的是找到并删除我试图使用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遍历时的最佳实践。非常感谢!!
答案 0 :(得分: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();
答案 1 :(得分:0)
您已经有一个忽略命名空间的工作解决方案,但LINQ to 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()