簡體   English   中英

使用C#從XML文件中刪除數據?

[英]remove data from XML file using 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文件中刪除航點。

有人可以建議我一種如何使用XMLDocument刪除它的方法嗎?

我相信您想使用RemoveChild API。 您還可以使用SelectSingleNode或SelectNodes API查找要刪除的節點,移動到其父節點並刪除它們。

您需要使用XmlNode.RemoveChild方法,但是請注意,僅當將其應用於您要刪除的節點的父節點時,此方法才有效,否則您將得到異常:

要刪除的節點不是該節點的子節點

從XmlDocument刪除節點中所述

下面的RemoveNode方法基於一個簡單的XML示例

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

上面的方法創建以下輸出:

原始流量模式:

徑向:001,距離:0.36,緯度:(48,31.7363644),經度:(11,57.53425)

徑向:090,距離:0.56,緯度:(48,31.7363644),經度:(11,57.53425)

徑向:240,距離:0.56,緯度:(48,31.7363644),經度:(11,57.53425)

徑向:346,距離:0.56,緯度:(48,31.7363644),經度:(11,57.53425)

用radius = 090刪除節點

新的流量模式:

徑向:001,距離:0.36,緯度:(48,31.7363644),經度:(11,57.53425)

徑向:240,距離:0.56,緯度:(48,31.7363644),經度:(11,57.53425)

徑向:346,距離:0.56,緯度:(48,31.7363644),經度:(11,57.53425)

我使用的支持方法復制如下。

第一種方法創建了一個航路點,因此上面的代碼並不那么混亂。 為了簡單起見,所有內容都是一個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));
        }
    }
}

您只能使用C# 執行此操作,但是使用XSLT可以輕松完成,而且.NET內置了出色的XSLT處理器 。XSLT是一種開放標准,專門設計用於將XML轉換為另一種XML格式(或HTML或文本)。

輸入XSLT如下所示,將其另存為removeelement.xslt:

<?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>

通過C#在您的輸入上調用它很容易。 XSLT當前包含一個參數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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM