0

私はxmlDocを持っています、これはその一部です:

<Main>
<Set>
    <MId>1</MId>
    <RName>
        <MetaData>
            <PrdctName>
                Test 1
            </PrdctName>
        </MetaData>
    </RName>
</Set>  
<Set>
    <MId>1</MId>
    <RName>
        <MetaData>
            <PrdctName>
                Test 2
            </PrdctName>
        </MetaData>
    </RName>
</Set>
<Set>
    <MId>1</MId>
    <RName>
        <MetaData>
            <PrdctName>
                Test 3
            </PrdctName>
        </MetaData>
    </RName>
</Set>
<Set>
    <MId>2</MId>
    <RName>
        <MetaData>
            <PrdctName>
                Test 1
            </PrdctName>
        </MetaData>
    </RName>
</Set>
</Main>

prdctNameを選択して、残りをxmlDocから削除する必要があります。たとえば、「テスト1」を選択した場合、結果は次のようになります。

<Main>
<Set>
    <MId>1</MId>
    <RName>
        <MetaData>
            <PrdctName>
                Test 1
            </PrdctName>
        </MetaData>
    </RName>
</Set>  
<Set>
    <MId>2</MId>
    <RName>
        <MetaData>
            <PrdctName>
                Test 1
            </PrdctName>
        </MetaData>
    </RName>
</Set>
</Main>

問題は、タグを削除する方法がわからないことです。したがって、削除後、xmlは次のようになります。

<Main>
<Set>
    <MId>1</MId>
    <RName>
        <MetaData>
            <PrdctName>
                Test 1
            </PrdctName>
        </MetaData>
    </RName>
</Set>
<Set/>
<Set/>
<Set>
    <MId>2</MId>
    <RName>
        <MetaData>
            <PrdctName>
                Test 1
            </PrdctName>
        </MetaData>
    </RName>
</Set>
</Main>

タグも削除するには、どのコードを書く必要がありますか?

これは私が今使っているコードの一部です:

foreach (XmlNode chkNode in nodes)
{                
            string currentName = "Test 1";
            if (!nameDict.ContainsKey(currentName))                                    
                    chkNode.ParentNode.RemoveAll();
}
4

3 に答える 3

3

あなたの問題はXmlNode.RemoveAll()ノードの子を削除することだけであり、 chkNode.ParentNodeプロパティは<Set>タグ付きのノードを選択していると思います。したがって、すべての子を削除すると、空の<Set/>ノードが残ります。その特定のノードも削除できる必要があります。

既存の方法を適応させるには、次のようなことを行う必要があります。

foreach (XmlNode chkNode in nodes)
{                
    string currentName = "Test 1";
    if (!nameDict.ContainsKey(currentName))
    {
        XmlNode parent = chkNode.ParentNode;
        parent.ParentNode.RemoveChild(parent);
    }
}

nameDictもちろん、正確に何であるかわからないので、これをそのままテストすることはできませんnodes

完全を期すために、このコードは、親(Attribute、Document、DocumentFragment、Entity、Notationノードなど)を持つことができない場合、chkNodeまたはchkNode.ParentNode持つことができない場合に壊れます。XmlNodesこれが考えられるシナリオであると思われる場合は、適切なnullチェックを含めるか、このメソッドをtry-catch

何かのようなもの:

XmlNode parent = chkNode.ParentNode;
if (parent != null && parent.ParentNode != null)
    parent.ParentNode.RemoveChild(parent);

または:

try
{
    XmlNode parent = chkNode.ParentNode;
    parent.ParentNode.RemoveChild(parent);
}
catch (NullReferenceException ex)
{
    // do something with exception
}

LINQには、より良い方法で目的を達成するためのいくつかのオプションがありますが、C#2.0を使用しているため、このソリューションは正しい方向に進むはずです。

于 2012-08-10T11:40:17.747 に答える
0

linqtoxmlとxpathを使用して実行できます。以下の例を見つけてください。

    var xdocument = XDocument.Parse(xml)
    xdocument.Document.Root.Elements()
   .Where(element 
       => !element.XPathSelectElement("RName/MetaData/PrdctName").Value.Contains("Test 1"))
   .Remove();
   // saving results...
   xdocument.Save("somewhere.xml");

PS

含まれているものをチェックするのはあまり良くありませValue.Contains("Test 1")んが、ここでは他の解決策はありません。

于 2012-08-10T11:31:17.037 に答える
0

あなたはこのように試すことができます。

1)タグを読み取り、内部xmlを使用してすべての子ノードをコピーします。

2)MainParentsであるルートノードに移動します。

3)ここで、内部のxml文字列を最初のステップで読み取ったxml文字列に置き換えます。

于 2018-07-12T13:04:15.563 に答える