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 节点),此代码chkNodechkNode.ParentNode中断XmlNodes。如果您认为这是一种可能的情况,您可能希望包含适当的空检查或将此方法包装在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

它可以在 linq to xml 和 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");

附言

检查包含不太好,Value.Contains("Test 1")但在这里看不到任何其他解决方案。

于 2012-08-10T11:31:17.037 回答
0

你可以试试这样..

1)读取标签并使用内部xml复制所有子节点。

2) 现在转到 MainParents 的根节点。

3) 现在用您在第一步中读取的 xml 字符串替换内部 xml 字符串。

于 2018-07-12T13:04:15.563 回答