2015-12-04 2 views
0

У меня есть следующий XML-файлКак удалить элемент из 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> 

Файл больше, чем это, но она представляет собой структуру. Я пытаюсь удалить элемент <Style>, но я не могу найти способ его исправить.

Я попробовал следующий метод: 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"); 

Коллекция Наследники всегда пусто.

Кроме того, когда я сохраняю файл, он добавляет «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 добавляется в конечном файле.
+1

Вам необходимо включить пространство имен с именем элемента, иначе синтаксический анализатор XML не найдет указанные узлы (узлы). В этом случае вам нужно использовать 'http: // www.opengis.net/kml/2.2'. – Tim

ответ

1

Чтобы получить доступ к узлу, вам необходимо включить пространство имен. На основе 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 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> 
+0

Он работает, спасибо. Любые идеи, как избежать добавления «kml:» в сохраненный файл? –

+0

Я не уверен, что вы имеете в виду - можете ли вы обновить свой вопрос с соответствующей информацией? Благодарю. – Tim

+0

Я изменил последнюю часть вопроса, чтобы продемонстрировать свою проблему с добавлением kml:. –

0

Конечно, вы можете использовать родной язык для реструктуризации XML под названием XSLT, не требующее зацикливания. В качестве информации 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# Script (см 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"); 

     } 
    } 
} 
Смежные вопросы