MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot ;
// 创建DOMDocument对象
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if ( ! SUCCEEDED(hr))
{
MessageBox( " 无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库! " );
return ;
}
// 根节点的名称为Book
// 创建元素并添加到文档中
xmlRoot = pDoc -> createElement((_bstr_t) " Book " );
// 设置属性
xmlRoot -> setAttribute( " id " ,( const char * )m_strId);
pDoc -> appendChild(xmlRoot);
MSXML2::IXMLDOMElementPtr pNode;
// 添加“author”元素
pNode = pDoc -> createElement((_bstr_t) " Author " );
pNode -> Puttext((_bstr_t)( const char * )m_strAuthor);
xmlRoot -> appendChild(pNode);
// 添加“Title”元素
pNode = pDoc -> createElement( " Title " );
pNode -> Puttext(( const char * )m_strTitle);
xmlRoot -> appendChild(pNode);
// 保存到文件
// 如果不存在就建立,存在就覆盖
pDoc -> save( " d://he.xml " );
------------------------------------------------------------------------------------------------------------------------------------------------
MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr;
hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if (FAILED(hr))
{
MessageBox( " 无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库! " );
return ;
}
// 加载文件
pDoc -> load( " d://he.xml " );
MSXML2::IXMLDOMNodePtr pNode;
// 在树中查找名为Book的节点," // "表示在任意一层查找
pNode = pDoc -> selectSingleNode( " //Book " );
MSXML2::DOMNodeType nodeType;
// 得到节点类型
pNode -> get_nodeType( & nodeType);
// 节点名称
CString strName;
strName = ( char * )pNode -> GetnodeName();
// 节点属性,放在链表中
MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap = NULL;
MSXML2::IXMLDOMNodePtr pAttrItem;
_variant_t variantvalue;
pNode -> get_attributes( & pAttrMap);
long count;
count = pAttrMap -> get_length( & count);
pAttrMap -> get_item( 0 , & pAttrItem);
// 取得节点的值
pAttrItem -> get_nodeTypedValue( & variantvalue);
m_strId = ( char * )(_bstr_t)variantvalue;
// 添加整个文档的根节点
void AddRootNode( CString strRootNode , CString strText = "")
{
m_pElement = m_pDoc->createElement( (LPCTSTR)strRootNode );
m_pElement ->put_text( _bstr_t( (LPCTSTR)strText) );
m_pDoc->appendChild( m_pElement );
}
三种最流行的开放源码 XML
库
是 expat、libxml 和 Xerces。这三者都是跨平台的,每一种都充当 XSLT 库
实现的基础,一旦满足了基本 XML
需要之后,它就会给您一条成长途径。
- expat 是 James Clark 创始的开放源码面向事件的 XML
解析库
。他已经将该项目转让给了 SourceForge 中的一个小组。有一个 SAX 封装器可供使用。在许多项目中都可以找到 expat 解析器,如开放源码浏览器 Mozilla、XSLT 处理器 Transformiix 和 RDF 工具 repat。 - libxml 为类似于 SAX 和 DOM 的操作提供了双重方式 API。它支持对 DTD 的验证,并且在 Gnome 的 XSLT 处理器 libxslt
中使用。libxml 经过重写,已作为 libxml(2) 发布,也许还称为 libxml2
。这个库
的用户应该确保他们拥有了当前版本。 - Xerces 是非常坚固的、拥有大量文档的库
,它充当 IBM alphaWorks XML
4C 库
的基础。Xerces 还用于 Apache XSLT 处理器 Xalan 中。Xerces 支持 DOM、SAX,以及对 DTD 的验证。最新版本读取并解释了部分“W3C XML
模式推荐”(打算到 2001 年底实现完整的 XML
模式支持)。
附:C/C++ 开发人员的解析器
库 |
供应商 |
事件 |
文档 |
特点 |
许可证 |
expat |
James Clark/expat 小组 | 本机与 SAX | - | 带有本机 API 和 SAX 封装器的、非常快速的推模型解析器。 | LGPL( 免费 ) |
libxml |
Gnome | SAX | DOM | 非常强壮;SAX 与 DOM 封装器;执行 DTD 验证 | LGPL(免费 ) |
MSXML |
Microsoft | SAX | DOM | Win32 的 Microsoft XML 库 |
EULA(免费 ) |
Xerces |
Apache Software Foundation | SAX | DOM | 执行 SAX 及 DOM 级别 1 和 2;DTD 验证;增加的 XML 模式 |
Apache(免费 ) |
XTL |
Vivid Creations | SAX | DOM | 带 SAX 和 DOM 的基于 STL 的 XML 工具箱 |
商业 |
RXP |
爱丁堡大学 | - | 本机 | 验证以 C 编写的了解名称空间的 XML 解析器 |
GPL(免费 ) |
XML 4C |
IBM alphaWorks | SAX | DOM | IBM 发起的 Xerces 的变体 | Apache(免费 ) |
Oracle XDK 8i |
Oracle | SAX | DOM | Oracle 主办的用于 C++ 的 XML 工具箱 |
非商业 |
Pull Parser |
Extreme! Lab | - | 本机 | 印地安那大学发起的用于 C++ 的轻量型 XML 工具箱 |
非商业 |
XML Booster |
PhiDaNi Software | - | 本机 | 解析器发生器,生成 C 源码解析器 | 商业 |