如何从XML中删除元素
本文关键字:删除 元素 XML | 更新日期: 2023-09-27 18:25:38
我确实有以下xml文件
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<open>1</open>
<Placemark>
<name>L14A</name>
<description>ID:01F40BF0
PLACEMENT:Home Woods
RSSI:-82
</description>
<Style>
<IconStyle>
<Icon>
<href>http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=3|0000CC|FFFFFF</href>
</Icon>
</IconStyle>
</Style>
<Point>
<coordinates>-73.16551208,44.71051217,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>
文件比它大,但它确实代表了结构。我正在尝试删除元素<Style>
,但找不到正确的方法。
我尝试了以下方法:当我们有多个具有相同名称但不同属性的元素时,如何使用Xdocument从xml中删除元素
代码为:
XDocument xdoc = XDocument.Load("kkk.kml");
xdoc.Descendants("Style").Remove();
xdoc.Save("kkk-mod.kml");
Descendants集合始终为空。
此外,当我保存文件时,它会将"kml:"附加到我的每个元素中(见下文)。
<kml:Placemark>
<kml:name>L14A</kml:name>
<kml:description>ID:01F40BF0
</kml:description>
<kml:Point>
<kml:coordinates>-73.200,44.500,0</kml:coordinates>
</kml:Point>
</kml:Placemark>
我怎样才能把它做好?
- 删除
- 附加在最终文件中的:kml
您需要包含名称空间才能访问节点。根据您发布的sampel XML,名称空间是http://www.opengis.net/kml/2.2
,因此应该使用类似的内容:
XDocument xdoc = XDocument.Load("kkk.kml");
XNamespace ns = "http://www.opengis.net/kml/2.2";
xdoc.Descendants(ns + "Style").Remove();
xdoc.Save("kkk-mod.kml");
如果要从修改后的文档中删除"kml"前缀,可以使用以下代码段。这将从文档中删除所有名称空间。
XDocument xdoc = XDocument.Load("kkk.kml");
XNamespace ns = "http://www.opengis.net/kml/2.2";
xdoc.Descendants(ns + "Style").Remove();
XElement newDoc = RemoveAllNamespaces(xdoc.Root);
xdoc.Save("kkk-mod.kml");
public static XElement RemoveAllNamespaces(XElement e)
{
return new XElement(e.Name.LocalName,
(from n in e.Nodes()
select ((n is XElement) ? RemoveAllNamespaces(n as XElement) : n)),
(e.HasAttributes) ?
(from a in e.Attributes()
where (!a.IsNamespaceDeclaration)
select new XAttribute(a.Name.LocalName, a.Value)) : null);
}
取自SO的回答。
生成的XML文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<kml>
<Document>
<open>1</open>
<Placemark>
<name>L14A</name>
<description>ID:01F40BF0
PLACEMENT:Home Woods
RSSI:-82
</description>
<Point>
<coordinates>-73.16551208,44.71051217,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>
当然,您可以使用一种称为XSLT的本地语言进行XML重构,而不需要循环。作为信息,XSLT是一种声明性的、专用的编程语言(与SQL类型相同),用于为各种最终用途需求重新格式化、设置样式和重新构建XML文档。实际上,所有通用语言都维护XSLT处理器,包括C#、Java、Python、PHP、Perl和VB.
下面是一个面向未来读者的解决方案,其中XSLT脚本运行身份转换以按原样复制整个文档,然后将一个空模板写入<Style>
节点,从而将其删除:
XSLT脚本 (另存为.xsl或.XSLT文件)
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:kml="http://www.opengis.net/kml/2.2"
xmlns:atom="http://www.w3.org/2005/Atom">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<!-- Identity Transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Empty Template for Style Elemeent -->
<xsl:template match="kml:Style"/>
</xsl:transform>
C#脚本(请参阅教程)
using System;
using System.Xml;
using System.Xml.Xsl;
namespace XSLTransformation
{
class Class1
{
static void Main(string[] args)
{
XslTransform myXslTransform;
myXslTransform = new XslTransform();
myXslTransform.Load("XSLTScript.xsl");
myXslTransform.Transform("InputXML.xml", "OutpuXML.xml");
}
}
}