Написание и удаление узла из XML-документа с использованием C # / Unity3D - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь добавить узлы в XML-документ, а затем удаляю их.Добавление узлов работает, но я не могу удалить узлы, пока не перезапущу программу.

Метод Write:

public void writeToExistingDoc (String fileNamePath, int x, int y, int t)
{
    string filename = fileNamePath;
    string xPos = "" + x;
    string yPos = "" + y;
    string type = "" + t;

    //create new instance of XmlDocument
    XmlDocument doc = new XmlDocument ();

    //load from file
    doc.Load (filename);

    //create node and add value
    XmlNode node = doc.CreateNode (XmlNodeType.Element, "BUILDING", null);

    XmlAttribute atr = doc.CreateAttribute ("x");
    XmlAttribute atr2 = doc.CreateAttribute ("y");
    XmlAttribute atr3 = doc.CreateAttribute ("type");
    atr.Value = xPos;
    atr2.Value = yPos;
    atr3.Value = type;
    node.Attributes.Append (atr);
    node.Attributes.Append (atr2);
    node.Attributes.Append (atr3);



    //add to elements collection
    doc.DocumentElement.AppendChild (node);

    Debug.Log ("Element added");
    //save back
    doc.Save (filename);

}

, а вот метод Remove:

public void removeBuildingNode (string fileNamePath, int buildingPosX, int buildingPosY)
{
    XmlDocument doc = new XmlDocument ();
    doc.Load (fileNamePath);
    XmlNodeList nodes = doc.SelectNodes ("//BUILDING[@x='" + buildingPosX + "']");
    for (int i = nodes.Count - 1; i >= 0; i--) {
        Debug.Log("" + i);
        nodes[i].ParentNode.RemoveChild (nodes[i]);
    }
    doc.Save(fileNamePath);
    Debug.Log(""+buildingPosX + ", " + buildingPosY);


}

Мой XML-документ выглядит так:

<BUILDINGS ID="b">
<BUILDING x="50" y="80" type="1" />
<BUILDING x="25" y="125" type="1" />
<BUILDING x="35" y="125" type="1" />
<BUILDING x="45" y="125" type="1" />
</BUILDINGS>

Как я уже сказал, методы работают, когда я впервые запускаю программу, использую метод записи, перезапускаю программу и использую метод удаления.Не будет работать на том же работающем экземпляре.

1 Ответ

0 голосов
/ 03 марта 2012

Если вы не хотите использовать XmlDocument, это должно сработать ...

Использование: http://searisen.com/xmllib/extensions.wiki

public void removeBuildingNode (string fileNamePath, int buildingPosX, int buildingPosY)
{
    XElement doc = XElement.Load(fileNamePath);
    var nodesToRemove = doc.Elements("BUILDING")
        .Where(xe => xe.Get("x", int.MinValue) == buildingPosX);

    foreach(XElement node in nodesToRemove.ToArray())
         node.Remove();

    doc.Save(fileNamePath);

    Debug.Log(""+buildingPosX + ", " + buildingPosY);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...