科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

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

关键字: XML 处理 C++ Linux

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

我只是在测试block中加了这段编码。如果你需要将一个应用程序从COM和MSXML4转换为.NET,要注意到capitalization有很大不同,其功能仅仅是返回你所需要的值,而不是产生一个指针指向它们为你指定的目标。和我在这儿所做的一样,那样会使连接成串的指令变得更简单。由于Managed C++ 对类型比较挑剔,只好使用Double::Parse() 将串变成编号,并且在传递给WriteLine()之前汇总。

本程序运行时,会显示:

Document loaded ok.
Purchase Order total is $13.72

如果你想退出XML,只需要一行编码:

System::Console::WriteLine(xmlDoc->InnerXml);

InnerXml 是String*,因此将其传递给WriteLine() 是没有问题的,不必要借助于任何中间变量。

XML 在 .NET 中处于什么位置?

在整个.NET体系中你将看到适用XML的多处地方。例如,你只要在申明中增加“可序列化”这一属性,任何一个类都可以把自己转换为 XML 或者从XML 转换回来。

下面以一个简单的类为例子,你可以把它转成为XML格式泵出,或者从XML格式输入赋值。

[Serializable]
public __gc class PurchaseOrder
{
public:
int customer;
// other elements to be added
PurchaseOrder(int id) {customer=id;}
PurchaseOrder() {customer=0;}
};

你为这个类加上可序列化(Serializable)标记。只有公开的变量才能这样序列化,而且这个类必须有一个隐含的构造函数。一旦满足了这些限制条件并且进行编译之后,事情就容易了。下面是怎样把这个对象卸出到文件中:

PurchaseOrder* po =
new PurchaseOrder(Int32::Parse(xmlDoc->
GetElementsByTagName("Customer")->Item(0)->
Attributes->GetNamedItem("id")->get_Value()));
System::Xml::Serialization::XmlSerializer* ser =
new System::Xml::Serialization::XmlSerializer(po->GetType());
System::IO::TextWriter* writer =
new System::IO::StreamWriter("po.xml");
ser->Serialize(writer,po);
writer->Close();

如果采用名字空间可以大大提高这段代码的可读性,但是这个例子是想展示和我所用的类所关联的完整的名字空间。第一行特别长,从头贯穿XML文件查找客户 (customer)标记,找到第一个后,查看它的标识(id) 属性,用它的值来构造采购单(PurchaseOrder)。然后,我创建了一个序列转换器和一个书写器,并且调用序列转换器的 serialize() 方法。输出的 po.xml 如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<PurchaseOrder xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<customer>123</customer>
</PurchaseOrder>

如果采购单是一个很大很复杂的类,可能是用.NET的某个收集类来保存一组事项,那我还是只需要这一小段代码把它按 XML格式输出:创建一个序列转换器和一个书写器,然后调用序列转换器的 serialize() 方法。从 XML 格式恢复对象时,顺序刚好相反:

PurchaseOrder* po2 = new PurchaseOrder();
ser = new System::Xml::Serialization::XmlSerializer(po2->GetType());
System::IO::FileStream* fs =
new System::IO::FileStream("po.xml",
System::IO::FileMode::Open);
po2 = (PurchaseOrder*) ser->Deserialize(fs);
System::Console::WriteLine("Rehydrated customer is {0}.",
__box(po2->customer));

如果你在ASP.NET或者Windows应用程序中使用数据网格(DataGrids),你可以从一个XML文件加载它们(很适合用来作快速演示),或者在你需要的时候,作为一种调试手段让它们把自己卸载到XML。只需简单地创建一个空的数据集(DataSet)对象,调用它的 Realxml() 方法来用一个文件中的 XML 填充它,然后把它作为你的数据网格的数据源去调用 DataBind() 方法。也可以用如下的方法从数据网格中取得 XML:

xmlstring = DataGrid1->DataSource->GetXml();

使用 .NET 类库你还可以用XML干很多的事。用一两行就可以产生 XML,从一种排放形式转换成另一种,或者是找到文档的某个子集。 利用Visual Studio中对于模式(schema)的支持,你可以生成一个匹配某个XML范例文件的模式,或者在编辑 XML时使用 Intellisense, 它知道你正在使用的模式, 当你打字输入时,随时提醒你当前允许使用的元素或者属性。XML处在.NET革命的心脏,所以你应该尽早了解它。

关于作者

Kate Gregory 是 Gregory Consulting Limited (http://www.gregcons.com/) 的创始人之一。 2002年一月,她被任命为MSDN在加拿大多伦多区的总监。她的 C++ 经验追溯到 Visual C++ 出现之前。在.NET, Visual Studio, XML, UML, C++, Java 和互联网等方面,她是各大学和微软活动中知名的演讲人和讲师。Kate 和她在Gregory Consulting的同事们擅长把软件开发和网站开发结合起来,创建生动的网站。她们生产高质量的通用的和定制的软件零件,用于网页和其他应用程序。 Kate 为 Que 写过很多书籍,包括“使用Visual C++ .NET 特辑”。

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

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

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