【问题标题】:XElement remove node found using LINQ使用 LINQ 找到的 XElement 删除节点
【发布时间】:2012-08-09 11:46:26
【问题描述】:

我有一个 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 />

我要删除的节点是:&lt;w:t&gt;References&lt;/w:t&gt;。我目前收到“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 遍历时,我仍在尝试学习最佳实践。非常感谢!!

【问题讨论】:

    标签: .net xml vb.net linq linq-to-xml


    【解决方案1】:

    我在这里做了一点猜测,因为这是 VB.net,我来自 C# 背景,但 LINQ 部分看起来是一样的。我认为您的问题在于Name.Equals("&lt;w:t&gt;") 部分。 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();
    

    【讨论】:

    • 非常感谢您的建议和信息。我发现它非常有用。我相信我会简单地导航到节点而不是使用 LINQ。再次感谢!
    【解决方案2】:

    您已经有了一个忽略命名空间的有效解决方案,但 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      相关资源
      最近更新 更多