0

我有一个 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 遍历时,我仍在尝试学习最佳实践。非常感谢!!

4

2 回答 2

1

我在这里做了一点猜测,因为这是 VB.net,而且我来自 C# 背景,但 LINQ 部分看起来是一样的。我认为你的问题出在Name.Equals("<w:t>")零件上。Name不是字符串而是 anXName并且它还有更多属性。您很可能需要查看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();
于 2012-08-09T11:53:26.660 回答
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()
于 2012-08-09T13:28:34.497 回答