2011-08-03 6 views
1

は私がC#を使用してXMLファイルからデータを削除しますか?

<TrafficPattern> 
    <WayPoint> 
     <Radial>001</Radial> 
     <Distance>0.36</Distance> 
     <Latitude> 
      <Degrees>48</Degrees> 
      <Minutes>31.7363644</Minutes> 
     </Latitude> 
     <Longitude> 
      <Degrees>11</Degrees> 
      <Minutes>57.53425</Minutes> 
     </Longitude> 
    </WayPoint> 
     <WayPoint> 
     <Radial>090</Radial> 
     <Distance>0.56</Distance> 
     <Latitude> 
      <Degrees>48</Degrees> 
      <Minutes>31.7363644</Minutes> 
     </Latitude> 
     <Longitude> 
      <Degrees>11</Degrees> 
      <Minutes>57.53425</Minutes> 
     </Longitude> 
    </WayPoint> 
    <WayPoint> 
     <Radial>240</Radial> 
     <Distance>0.56</Distance> 
     <Latitude> 
      <Degrees>48</Degrees> 
      <Minutes>31.7363644</Minutes></Latitude> 
     <Longitude> 
      <Degrees>11</Degrees> 
      <Minutes>57.53425</Minutes></Longitude> 
    </WayPoint> 
    <WayPoint> 
     <Radial>346</Radial> 
     <Distance>0.56</Distance> 
     <Latitude> 
      <Degrees>48</Degrees> 
      <Minutes>31.7363644</Minutes></Latitude> 
     <Longitude> 
      <Degrees>11</Degrees> 
      <Minutes>57.53425</Minutes></Longitude> 
    </WayPoint> 
</TrafficPattern> 

私はXMLDocumentを使用して上記のXMLファイルを書いた次のデータを含むXMLドキュメントを実装しました。

今、ボタンクリックでXMLファイルからウェイポイントを削除します。

XMLDocumentを使用してどのように削除することができますか?

答えて

2

あなたはXmlNode.RemoveChildメソッドを使用する必要がありますが、あなたが削除しようとしている、またはあなたが例外を取得するノードの親にそれを適用する場合にのみ動作することに注意してください:

削除されるノードはこのノードの子ノードではない

removing nodes from an XmlDocumentで説明されている。

RemoveNodeは、a simple XML exampleに基づいています。

オリジナルトラフィックパターン:

ラジアル:001、距離:0.36、緯度:(48、31.7363644)、経度:(11、

public sealed class TestXmlNodeRemoval 
{ 
    public static void RemoveNode() 
    { 
     var xmlDocument = new XmlDocument(); 
     var xmlTrafficPattern = xmlDocument.CreateElement("TrafficPattern"); 
     xmlDocument.AppendChild(xmlTrafficPattern); 

     xmlTrafficPattern.AppendChild(CreateWayPoint(xmlDocument, 
          "001", "0.36", "48", "31.7363644", "11", "57.53425")); 
     xmlTrafficPattern.AppendChild(CreateWayPoint(xmlDocument, 
          "090", "0.56", "48", "31.7363644", "11", "57.53425")); 
     xmlTrafficPattern.AppendChild(CreateWayPoint(xmlDocument, 
          "240", "0.56", "48", "31.7363644", "11", "57.53425")); 
     xmlTrafficPattern.AppendChild(CreateWayPoint(xmlDocument, 
          "346", "0.56", "48", "31.7363644", "11", "57.53425")); 

     Console.WriteLine(@"Original traffic pattern:"); 
     DisplayXmlDocument(xmlDocument); 

     // create an arbitrary criterion to remove an element 
     const string radialToRemove = @"090"; 
     Console.WriteLine(@"Remove node with radial=" + radialToRemove); 

     if (xmlDocument.DocumentElement != null) 
     { 
      for (var i = 0; i < xmlDocument.DocumentElement.ChildNodes.Count; ++i) 
      { 
       var radial = 
       xmlDocument.DocumentElement.ChildNodes[i].SelectSingleNode("Radial"); 

       if (radial == null || (radial.InnerText != radialToRemove)) 
       { 
        continue; 
       } 

       var nodeToRemove = xmlDocument.DocumentElement.ChildNodes[i]; 

       // note that you need to remove node from the Parent 
       if (nodeToRemove.ParentNode != null) 
       { 
        nodeToRemove.ParentNode.RemoveChild(nodeToRemove); 
       } 

       break; 
      } 
     } 

     Console.WriteLine(@"New traffic pattern:"); 
     DisplayXmlDocument(xmlDocument); 
    } 
} 

この上記方法は、以下の出力を生成します57.53425)

ラジアル:090、距離:0.56、緯度:(48、31.7363644)、経度(11 57.53425)

ラジアル:2 40、距離:0.56、緯度:(48、31.7363644)、経度(11 57.53425)

ラジアル:346、距離:0.56、緯度:(48、31.7363644)、経度(11 57.53425)

ラジアル:001、距離:0.36、緯度:(48、31.7363644)、経度(11 57.53425)

ラジアル:240半径= 090

新しいトラフィックパターンと

削除ノード、距離:0.56、緯度:(48,31.7363644)、経度:(11,57.53425)

ラジアル:346、距離:0.56、緯度:(48、31.7363644)、経度(11 57.53425)

Iを使用支持方法を以下にコピーされます。

最初の方法はウェイポイントを作成するので、上記のコードはあまりうまくいきません。簡単にするために、すべてがstringだが、私はおそらくより良いパラメータの型

private static XmlElement CreateWayPoint(XmlDocument xmlDoc, 
              string radial, 
              string distance, 
              string latDegrees, 
              string latMinutes, 
              string longDegrees, 
              string longMinutes) 
{ 
    var xmlWayPoint = xmlDoc.CreateElement("WayPoint"); 

    var xmlRadial = xmlDoc.CreateElement("Radial"); 
    xmlRadial.InnerText = radial; 
    xmlWayPoint.AppendChild(xmlRadial); 

    var xmlDistance = xmlDoc.CreateElement("Distance"); 
    xmlDistance.InnerText = distance; 
    xmlWayPoint.AppendChild(xmlDistance); 

    var xmlLatitude = xmlDoc.CreateElement("Latitude"); 
    var xmlLatDegrees = xmlDoc.CreateElement("Degrees"); 
    xmlLatDegrees.InnerText = latDegrees; 
    xmlLatitude.AppendChild(xmlLatDegrees); 
    var xmlLatMinutes = xmlDoc.CreateElement("Minutes"); 
    xmlLatMinutes.InnerText = latMinutes; 
    xmlLatitude.AppendChild(xmlLatMinutes); 
    xmlWayPoint.AppendChild(xmlLatitude); 

    var xmlLongitude = xmlDoc.CreateElement("Longitude"); 
    var xmlLongDegrees = xmlDoc.CreateElement("Degrees"); 
    xmlLongDegrees.InnerText = longDegrees; 
    xmlLongitude.AppendChild(xmlLongDegrees); 
    var xmlLongMinutes = xmlDoc.CreateElement("Minutes"); 
    xmlLongMinutes.InnerText = longMinutes; 
    xmlLongitude.AppendChild(xmlLongMinutes); 
    xmlWayPoint.AppendChild(xmlLongitude); 

    return xmlWayPoint; 
} 

を選ぶだろうと、このメソッドは、XMLドキュメントを表示します。

private static void DisplayXmlDocument(XmlNode xmlDoc) 
{ 
    var wayPoints = xmlDoc.SelectNodes("TrafficPattern/WayPoint"); 

    if (wayPoints == null) 
    { 
     return; 
    } 

    foreach (XmlNode wayPoint in wayPoints) 
    { 
     var radial = wayPoint.SelectSingleNode("Radial"); 
     var distance = wayPoint.SelectSingleNode("Distance"); 
     var latitudeDegrees = wayPoint.SelectSingleNode("Latitude/Degrees"); 
     var latitudeMinutes = wayPoint.SelectSingleNode("Latitude/Minutes"); 
     var longitudeDegrees = wayPoint.SelectSingleNode("Longitude/Degrees"); 
     var longitudeMinutes = wayPoint.SelectSingleNode("Longitude/Minutes"); 

     if (radial != null && 
      distance != null && 
      latitudeDegrees != null && 
      latitudeMinutes != null && 
      longitudeDegrees != null && 
      longitudeMinutes != null) 
     { 
      Console.WriteLine(string.Format("Radial:{0}, 
              Distance:{1}, 
              Latitude:({2}, {3}), 
              Longitude:({4}, {5})", 
              radial.InnerText, 
              distance.InnerText, 
              latitudeDegrees.InnerText, 
              latitudeMinutes.InnerText, 
              longitudeDegrees.InnerText, 
              longitudeMinutes.InnerText)); 
     } 
    } 
} 
2

RemoveChild APIを使用したいと考えています。また、SelectSingleNodeまたはSelectNodes APIを使用して、削除するノードを見つけて、その親ノードに移動して削除することもできます。

1

あなたこの唯一のC#を行うことができますが、これは行われますXSLTでより簡単に、そして.NETには優れたXSLT processorが組み込まれています.XSLTはオープンスタンダードであり、XMLをXML(またはHTMLまたはテキスト)の別のフォーマットに変換するように特別に設計されています。

入力XSLTはremoveelement.xsltとして保存し、次のようになります。ご入力の上のC#からこれを呼び出す

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:param name="Radial"/> 
    <xsl:output indent="yes" /> 

    <xsl:template match="TrafficPattern"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates select="WayPoint[not(Radial = $Radial)]" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*" /> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

は簡単です。 XSLTには現在1つのパラメータRadialが含まれていますが、削除するノードを選択するために必要なものに拡張することができます。次に、入力XML(input.xml)を使用してXSLTを呼び出す例を示します。

// Load the xslt stylesheet: 
XslCompiledTransform xslt = new XslCompiledTransform(); 
xslt.Load("removeelement.xslt"); 

// Create the XsltArgumentList with param 
XsltArgumentList xslArg = new XsltArgumentList(); 
xslArg.AddParam("Radial", "", "090"); 

// do the transformation on your input (can also use Stream or TextWriter) 
using (XmlWriter w = XmlWriter.Create("output-with-removed-element.xml")) 
{ 
    xslt.Transform("input.xml", xslArg, w); 
} 
関連する問題