【问题标题】:How to remove element from XML如何从 XML 中删除元素
【发布时间】:2015-12-04 17:14:56
【问题描述】:

我确实有以下 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&amp;chld=3|0000CC|FFFFFF</href>
                </Icon>
            </IconStyle>
        </Style>
        <Point>
            <coordinates>-73.16551208,44.71051217,0</coordinates>
        </Point>
    </Placemark>
</Document>
</kml>

文件比那个大,但它确实代表了结构。我正在尝试删除元素 &lt;Style&gt;,但找不到正确的方法。

我尝试了以下方法: How to remove an element from an xml using Xdocument when we have multiple elements with same name but different attributes

代码是:

    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>

我怎样才能做到正确?

  1. 删除
  2. :kml 附加在最终文件中。

【问题讨论】:

  • 您需要在元素名称中包含命名空间,否则 XML 解析器将找不到指定的节点。在这种情况下,您需要使用http://www.opengis.net/kml/2.2

标签: c# xml linq


【解决方案1】:

您需要包含命名空间才能访问节点。根据您发布的示例 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”前缀,可以使用以下代码sn -p。这将从文档中删除所有命名空间。

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 answer

生成的 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>  

【讨论】:

  • 它有效,谢谢。任何想法如何避免在保存的文件中添加“kml:”?
  • 我不确定你的意思 - 你能用相关信息更新你的问题吗?谢谢。
  • 我已经更改了问题的最后一部分以证明我对 kml 的问题:加法。
  • 您要删除kml,还是保留它?
  • @DavidMercier - 然后试试我上面编辑的例子。这应该可以解决问题。
【解决方案2】:

当然,您可以使用不需要循环的称为XSLT 的本地语言进行 XML 重组。作为信息,XSLT 是一种声明性的、专用的编程语言(与 SQL 相同的类型),用于重新格式化、样式化和重新构造 XML 文档以满足各种最终使用需求。几乎所有通用语言都维护 XSLT 处理器,包括 C#、Java、Python、PHP、Perl 和 VB。

以下是面向未来读者的解决方案,其中 XSLT 脚本运行身份转换以按原样复制整个文档,然后将空模板写入 &lt;Style&gt; 节点,从而将其删除:

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# 脚本(参见tutorial

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"); 

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多