Visual C++ .NET/XML/DOM

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Recursive navigation of the DOM tree

<source lang="csharp">

  1. include "stdafx.h"

using namespace System; using namespace System::Xml;

void Navigate(XmlNode ^node, int depth) {

   if (node == nullptr)
       return;
   Console::WriteLine(depth);
   Console::WriteLine(node->NodeType.ToString());
   Console::WriteLine(node->Name);
   Console::WriteLine(node->Value);
   if (node->Attributes != nullptr)
   {
       for (int i = 0; i < node->Attributes->Count; i++)
       {
           Console::WriteLine(depth+1);
           Console::WriteLine(node->Attributes[i]->Name);
           Console::WriteLine(node->Attributes[i]->Value);
       }
   }
   Navigate(node->FirstChild, depth+1);
   Navigate(node->NextSibling, depth);

}

void main() {

   XmlDocument ^doc = gcnew XmlDocument();
   try
   {
       XmlReader ^reader = XmlReader::Create("..\\Monsters.xml");
       doc->Load(reader);
       reader->Close();
       XmlNode ^node = doc->FirstChild;
       
       Navigate(node, 0);
   }
   catch (Exception ^e)
   {
       Console::WriteLine("Error Occurred: {0}", e->Message);
   }

}

 </source>


Update XML DOM

<source lang="csharp">

  1. include "stdafx.h"

using namespace System; using namespace System::Xml; void Navigate(XmlNode ^node) {

   if (node == nullptr)
       return;
   if (node->Value != nullptr && node->Value->Equals("D"))
   {
       if (node->ParentNode->ParentNode["Name"]->FirstChild->Value->Equals("G"))
       {
           node->Value = "S";
           node->ParentNode->Attributes["Damage"]->Value = "1d8";
       }
   }
   Navigate(node->FirstChild);
   Navigate(node->NextSibling);

}

void main() {

   XmlDocument ^doc = gcnew XmlDocument();
   try{
       doc->Load("a.xml");
       XmlNode ^root = doc->DocumentElement; 
       Navigate(root);
       doc->Save("New.xml");
   }catch (Exception ^e){
       Console::WriteLine("Error Occurred: {0}", e->Message );
   }

}

 </source>


Write XML DOM

<source lang="csharp">

  1. include "stdafx.h"

using namespace System; using namespace System::Xml; XmlElement ^CreateMonster(XmlDocument ^doc){

   XmlElement ^skeleton = doc->CreateElement("M");
   XmlElement ^name = doc->CreateElement("N");
   name->AppendChild(doc->CreateTextNode("S"));
   skeleton->AppendChild(name);
   XmlElement ^hitdice = doc->CreateElement("H");
   XmlAttribute ^att = doc->CreateAttribute("D");
   att->Value = "1";
   hitdice->Attributes->Append(att);
   att = doc->CreateAttribute("Default");
   att->Value = "3";
   hitdice->Attributes->Append(att);
   skeleton->AppendChild(hitdice);
   XmlElement ^weapon = doc->CreateElement("W");
   att = doc->CreateAttribute("N");
   att->Value = "2";
   weapon->Attributes->Append(att);
   att = doc->CreateAttribute("D");
   att->Value = "1";
   weapon->Attributes->Append(att);
   weapon->AppendChild(doc->CreateTextNode("C"));
   skeleton->AppendChild(weapon);
   return skeleton;

} void main() {

   XmlDocument ^doc = gcnew XmlDocument();
   try
   {
       doc->Load("a.xml");
       XmlNode ^root = doc->DocumentElement; 
       XmlNode ^child = root->FirstChild->NextSibling;
       root->InsertAfter(CreateMonster(doc), child);

       doc->Save("New.xml");
   }
   catch (Exception ^e)
   {
       Console::WriteLine("Error Occurred: {0}", e->Message );
   }

}

 </source>