在 C# 中获取特定节点/标记的父节点/标记

本文关键字:父节点 标记 节点 获取 | 更新日期: 2023-09-27 17:57:03

我需要使用 c# 删除特定的 xml 标记,但问题是,该标记可能位于不同的父标记中。

所以我需要搜索该特定标签并获取其父标签,然后将其删除。

这是我的 xml 文件

<PublisherInfo>
    <PublisherName value="1">Askquestionzero Publisher</PublisherName>
    <PublisherLocation>Ph</PublisherLocation>
    <PublisherImprintName>Askquestionzero</PublisherImprintName>
    <PublisherLogo>
      <Tada>Remove this value and its content</Tada>
    </PublisherLogo>
    <PublisherURL>Askquestionzero.com</PublisherURL>
</PublisherInfo>  

这是我的代码

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:'Users'user'Desktop'askquestion.xml");
XmlNode nodeToDelete = xmlDoc.SelectSingleNode("/PublisherInfo/PublisherLogo/Tada");
if (nodeToDelete != null)
{
    nodeToDelete.ParentNode.RemoveChild(nodeToDelete);
}
Console.WriteLine(xmlDoc.OuterXml);

代码有效,但我需要指定其父标签。那么如何遍历 xml 文件,如果找到 Tada 标签,获取其父标签然后将其删除。

预期输出:

<PublisherInfo>
    <PublisherName value="1">Askquestionzero Publisher</PublisherName>
    <PublisherLocation>Ph</PublisherLocation>
    <PublisherImprintName>Askquestionzero</PublisherImprintName>
    <PublisherLogo>
    </PublisherLogo>
    <PublisherURL>Askquestionzero.com</PublisherURL>
</PublisherInfo> 

另一个问题:

我还需要更改 xml 文件的节点。该文件与上述相同。

下面是用于更改 xml 节点/标记名称的代码。但它保留了它的属性。我希望它更改其标签名称并删除其属性。

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(@"C:'Users'user'Desktop'askquestion.xml");
Console.WriteLine(xmlDocument.OuterXml);
XmlElement element = (XmlElement)xmlDocument.GetElementsByTagName("PublisherName")[0];
XmlElement renamedElement = (XmlElement)RenameNode(element, null, "new-element");
Console.WriteLine(xmlDocument.OuterXml);
public static XmlNode RenameNode(XmlNode node, string namespaceUri, string qualifiedName)
{
    if (node.NodeType == XmlNodeType.Element)
    {
        XmlElement oldElement = (XmlElement)node;
        XmlElement newElement = node.OwnerDocument.CreateElement(qualifiedName, namespaceUri);
        while (oldElement.HasAttributes)
        {
        newElement.SetAttributeNode(oldElement.RemoveAttributeNode(oldElement.Attributes[0]));
        }
        while (oldElement.HasChildNodes)
        {
            newElement.AppendChild(oldElement.FirstChild);
        }
        if (oldElement.ParentNode != null)
        {
            oldElement.ParentNode.ReplaceChild(newElement, oldElement);
        }
        return newElement;
    }
    else
    {
        return null;
    }
}

上面代码的输出:

<new-element value="1">Askquestionzero Publisher</new-element>

期望输出:

<new-element>Askquestionzero Publisher</new-element>

在 C# 中获取特定节点/标记的父节点/标记

我更喜欢使用 XDocument ,使用 LinqXml您可以找到元素并调用Remove如图所示。

    XDocument doc = XDocument.Load(filepath);
    doc.Descendants("Tada")
        .First()
        .Remove();

关于其他问题,如果要删除属性,则可以使用相同的逻辑(如下所示)。

    doc.Descendants("new-element")
        .Select(e=>e.Attribute("value"))
        .Remove();

由于您想更改TagName,我更喜欢添加新元素并删除现有元素(如评论中所述)。下面的代码删除了PublisherName元素,该元素将value作为属性之一。

    var elements=doc.Descendants("PublisherName")
        .Where(e=>e.Attribute("value") != null);
    foreach(var element in elements)
    {
        element.Parent.Add(new XElement("new-element", (string)element.Value));
    }

检查此Demo