科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件[.NET]:在Managed C++中处理XML (1)

[.NET]:在Managed C++中处理XML (1)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

[.NET]:在Managed C++中处理XML (1)

作者:Kate Gregory著 申小玲编译  来源:赛迪网 2007年11月6日

关键字: XML 处理 C++ Linux

  • 评论
  • 分享微博
  • 分享邮件

在这篇文章中,我将用.NET框架来处理XML。

使用.NET中具备XML功能所带来的优越性包括:

● 无需任何安装、配置或重新分配,反正你的apps也是需要这个框架的,而只要你有这个框架,就万事俱备了;

● 编码更简单,因为你不是在处理COM。比如,你不必要调用CoInitialize() 和 CoUninitialize();

● 具有比MSXML4更多的功能。

XML实例

我将用下面的例子来加以说明:

<?xml version="1.0" encoding="utf-8" ?> 
<PurchaseOrder>
<Customer id="123"/>
<Item SKU="1234" Price="4.56" Quantity="1"/>
<Item SKU="1235" Price="4.58" Quantity="2"/>
</PurchaseOrder>

用XmlDocument加载XML

处理XML的classes放在System::Xml namespace 中。XmlDocument表示一个DOM 文件,即XML被装载的子目录。这和在MSXML4方法中的DOMDocument是一样的。下面是一个简单的Managed C++应用程序,在内存中装入了XML文件:

#include "stdafx.h"
#using <mscorlib.dll>
#include <tchar.h>
using namespace System;
#using <System.Xml.dll>
using namespace System::Xml;
// This is the entry point for this application
int _tmain(void)
{
  XmlDocument* xmlDoc = new XmlDocument();
  try
  {
    xmlDoc->Load("sample.xml");
    System::Console::WriteLine("Document loaded ok." );
  }
  catch (Exception *e)
  {
    System::Console::WriteLine("load problem");
    System::Console::WriteLine(e->Message);
  }
  return 0;
}

#using 语句非常重要。没有它,就会出现一些奇怪的编译错误,如'Xml' : is not a member of 'System' 或 'Xml' : a namespace with this name does not exist. 在C#或VB.NET中,有一个Project,Add References 菜单项目自动为你完成这项工作,但是在C++中,编程者必须自己去完成。你可以在在线帮助中找到class或namespace汇编。

另外注意到,在编码中没有象COM方法中那样使用Load()返回值。如果不能加载XML,加载程序将报告异常。

文档内容的简单算法

这里是.NET方式中相应的编码。

xmlDoc->Load("sample.xml");
double total = 0;
System::Console::WriteLine("Document loaded ok." );
XmlNodeList* items = xmlDoc->GetElementsByTagName("Item");
long numitems = items->Count;
for (int i=0;i<numitems;i++)
{
  XmlNode* item = items->Item(i);
  double price =
    Double::Parse(item->Attributes->GetNamedItem("Price")->
                  get_Value());
  double qty =
    Double::Parse(item->Attributes->GetNamedItem("Quantity")->
                  get_Value());
  total += price * qty;
}
System::Console::WriteLine("Purchase Order total is ${0}",
                           __box(total));

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章