Visual C++ .NET/XML/XmlReader
Содержание
Does it have attribute
<source lang="csharp">
- include "stdafx.h"
- using <system.xml.dll>
using namespace System; using namespace System::Xml; void main() {
XmlReader ^reader; reader = XmlReader::Create("..\\Monsters.xml"); while (reader->Read()){ switch (reader->NodeType) { case XmlNodeType::Comment: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Value); break; case XmlNodeType::Element: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); if (reader->HasAttributes) { while (reader->MoveToNextAttribute()) { Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); Console::WriteLine(reader->Value); } reader->MoveToElement(); } if (reader->IsEmptyElement) { Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); } break; case XmlNodeType::EndElement: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); break; case XmlNodeType::Text: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Value); break; case XmlNodeType::XmlDeclaration: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); if (reader->HasAttributes) { while (reader->MoveToNextAttribute()) { Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); Console::WriteLine(reader->Value); } } reader->MoveToElement(); Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); break; case XmlNodeType::Whitespace: break; default: Console::WriteLine("***UKNOWN*** node"); Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); Console::WriteLine(reader->Value); } }
}
</source>
Load xml from file
<source lang="csharp">
- include "stdafx.h"
- using <system.xml.dll>
using namespace System; using namespace System::Xml; void main() {
XmlReader ^reader; reader = XmlReader::Create("..\\Monsters.xml"); while (reader->Read()){ switch (reader->NodeType) { case XmlNodeType::Comment: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Value); break; case XmlNodeType::Element: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); if (reader->HasAttributes) { while (reader->MoveToNextAttribute()) { Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); Console::WriteLine(reader->Value); } reader->MoveToElement(); } if (reader->IsEmptyElement) { Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); } break; case XmlNodeType::EndElement: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); break; case XmlNodeType::Text: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Value); break; case XmlNodeType::XmlDeclaration: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); if (reader->HasAttributes) { while (reader->MoveToNextAttribute()) { Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); Console::WriteLine(reader->Value); } } reader->MoveToElement(); Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); break; case XmlNodeType::Whitespace: break; default: Console::WriteLine("***UKNOWN*** node"); Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); Console::WriteLine(reader->Value); } }
}
</source>
Output depth of element
<source lang="csharp">
- include "stdafx.h"
- using <system.xml.dll>
using namespace System; using namespace System::Xml; void main() {
XmlReader ^reader; reader = XmlReader::Create("..\\Monsters.xml"); while (reader->Read()){ switch (reader->NodeType) { case XmlNodeType::Comment: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Value); break; case XmlNodeType::Element: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); if (reader->HasAttributes) { while (reader->MoveToNextAttribute()) { Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); Console::WriteLine(reader->Value); } reader->MoveToElement(); } if (reader->IsEmptyElement) { Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); } break; case XmlNodeType::EndElement: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); break; case XmlNodeType::Text: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Value); break; case XmlNodeType::XmlDeclaration: Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); if (reader->HasAttributes) { while (reader->MoveToNextAttribute()) { Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); Console::WriteLine(reader->Value); } } reader->MoveToElement(); Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); break; case XmlNodeType::Whitespace: break; default: Console::WriteLine("***UKNOWN*** node"); Console::WriteLine(reader->Depth); Console::WriteLine(reader->Name); Console::WriteLine(reader->Value); } }
}
</source>
Set indent char for xml output
<source lang="csharp">
- include "stdafx.h"
- using <system.xml.dll>
using namespace System; using namespace System::Xml; void main() {
XmlReader ^reader; XmlWriter ^writer; try { reader = XmlReader::Create("a.xml"); XmlWriterSettings ^settings = gcnew XmlWriterSettings(); settings->Indent = true; settings->IndentChars = (" "); writer = XmlWriter::Create("New.xml", settings); while (reader->Read()) { switch (reader->NodeType) { case XmlNodeType::Comment: writer->WriteComment(reader->Value); break; case XmlNodeType::Element: writer->WriteStartElement(reader->Name); writer->WriteAttributes(reader, false); if (reader->IsEmptyElement) writer->WriteEndElement(); break; case XmlNodeType::EndElement: writer->WriteEndElement(); if (reader->Name->Equals("Name")) { writer->WriteStartElement("A"); writer->WriteString("False"); writer->WriteEndElement(); } break; case XmlNodeType::Text: writer->WriteString(reader->Value); break; case XmlNodeType::XmlDeclaration: writer->WriteStartDocument(); break; } } writer->Flush(); } catch (Exception ^e) { Console::WriteLine("XML Update Aborted -- {0}", e->Message); } finally { if (writer->WriteState != WriteState::Closed) { writer->Close(); } if (reader->ReadState != ReadState::Closed) { reader->Close(); } }
}
</source>
Validate XML
<source lang="csharp">
- include "stdafx.h"
- using <system.xml.dll>
using namespace System; using namespace System::Xml; using namespace System::Xml::Schema; ref class ValidateXML { public:
ValidateXML(String ^filename) { XmlReader ^vreader; try { XmlReaderSettings ^settings = gcnew XmlReaderSettings(); settings->ProhibitDtd = false; settings->ValidationType = ValidationType::DTD; vreader = XmlReader::Create(filename, settings); while(vreader->Read()) { // ... Process nodes just like XmlTextReader() } Console::WriteLine("Finished Processing"); } catch (Exception ^e) { Console::WriteLine(e->Message); } finally { if (vreader->ReadState != ReadState::Closed) { vreader->Close(); } } }
}; void main() {
gcnew ValidateXML("Bad.xml"); gcnew ValidateXML("good.xml");
}
</source>