我需要使用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>
答案 0 :(得分:1)
我更喜欢使用XDocument
,使用Linq
到Xml
,您可以找到该元素并调用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