0

Word ドキュメントから XML を解析して作成された 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 トラバーサルに関して、ベスト プラクティスを学ぼうとしています。どうもありがとう!!

4

2 に答える 2

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"))

質問の 2 番目の部分については、1 つのノードのみを削除する場合、その 1 つの特定のノードに移動する方が、1 つのノードのみが一致するドキュメント グローバル ルールを作成するよりもはるかに効率的です。あなたの問題に対する私のアプローチは、次のようになります。

newBody.Element("p").Element("r").Element("t").Remove();
于 2012-08-09T11:53:26.660 に答える
0

名前空間を無視する実用的なソリューションは既にありますが、LINQ to XML は名前空間内の要素へのアクセスをサポートしているため、次の 2 つのオプションがあることを示します。

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 に答える