C++ 如何获取 XML数据

C++ 如何获取 XML数据,第1张

XML读取有比较多的方法。

最直接的是直接读取文件,然后分析字符串寻找<title>来获得标题。

如果系统地读取最好选择合适的第三方模块来读取,比较常见的有微软的MSXML,基于COM的。

SQL Server 使得以XML导出数据变得更加简单 但在SQL Server 中导入XML数据并对其进行处理则有些麻烦

如果你参考Books Online(BOL) 你会发现有相关的条目 包括OPENXML以及 OPENROWSET 所有的这些例子都支持将XML文本作为已经声明的变量 这对于经常处理文本的用户来说非常方便 但对于希望在开发中读取XML文件并进行相应处理的开发人员来说就不是这样了 处理这样的问题 或许最好从内到外来对其进行分析

OPENXML是一个rowset函数(即返回一个rowset) 它的工作方式类似于rowset函数OPENQUERY和 OPENROWSET 使用OPENXML可以对XML数据执行JOINs *** 作而无需首先导入数据 你还可以将其同INSERT SELECT UPDATE以及DELETE等 *** 作联合使用 然而 要使用OPENXML 你必须执行两项OPENQUERY和OPENROWSET并不需要的任务 这两项任务需要两个系统存储进程 第一个是sp_xml_preparedocument 它将读取特定的XML文本并将其内容提取到内存中 其语法如下

sp_xml_preparedocument @hdoc = OUTPUT

[ @xmltext = ]

[ @xpath_namespaces =

具体参数如下 @hdoc 指向某内存区域的句柄(从作用上看等同于一个指针) 相关数据存放在这里 注意这是一个输出变量 当该进程运行后 该变量将包含指向XML文件内容在内存地址的句柄 由于你需要在随后使用此结果 因此要确保对其进行保存; @xmltext 实际上你所希望处理的XML文本; @xml_namespaces 为了正常 *** 作你的XML数据所需要的任何名字空间索引(namespace references) 注意在这里出现的任何URL都需要用尖括号(< >)括起来; 假设所传递的这些参数都有效 并且XML文档存在 那么你的XML数据就会被存放到内存中去 现在你就可以调用 sp_xml_preparedocument 传递存放有XML文件的变量 然后执行OPENXML 语法如下

OPENXML(idocint [in] rowpatternnvarchar[in] [flag yte[in]])

[WITH (SchemaDeclaration | TableName)]

注意 在本文中没有足够的文字来描述OPENXML所接收的参数 请参阅BOL以获取更多信息 在Transact SQL Reference中查找OPENXML

现在我们已经到达了最后的步骤 所有剩下的工作就是导入一个实际的XML文件到SQL并进行处理(很奇快为什么所有的BOL示例都没有涉及到这一关键的部分) (我必须感谢我的同事Billy Pang所给予的帮助 他帮助我解决这个问题 并给出了代码——尽管出于本文需要我对代码进行了裁减 谢谢Billy!) 基本的技巧是 将文件逐行按文本读取 然后把所有读取的行连接为一个大的VARCHAR变量 最后 将变量传递给前面所说的代码

以下就是读取文件并将其内容存放到某变量的代码

DECLARE @FileName varchar( )

DECLARE @ExecCmd VARCHAR( )

DECLARE @y INT

DECLARE @x INT

DECLARE @FileContents VARCHAR( )

CREATE TABLE #tempXML(PK INT NOT NULL IDENTITY( ) ThisLine VARCHAR( ))

SET @FileName = C:\Temp\CurrentSettings xml

SET @ExecCmd = type + @FileName

SET @FileContents =

INSERT INTO #tempXML EXEC master dbo xp_cmdshell @ExecCmd

SELECT @y = count() from #tempXML

SET @x =

WHILE @x < > @y

BEGIN

SET @x = @x +

SELECT @FileContents = @FileContents + ThisLine from #tempXML WHERE PK

= @x

END

SELECT @FileContents as FileContents

DROP TABLE #tempXML

现在在变量@FileContents变量中你已经获得了文件的全部内容 所需要做的只是将变量通过@xmltext参数传递给sp_xml_preparedocument 然后再调用OPENXML

lishixinzhi/Article/program/SQLServer/201311/22101

html代码如下:

<html>

<head>

<title>html读取xml数据实例一</title>

</head>

<body>

<xml id="xx" src="tablexml">

</xml>

<h3>html读取xml数据实例一</h3>

<table datasrc="#xx" border="1">

<thead> <th>序号</th> <th>区域</th> <th>名字</th> <th>电话</th> <th>QQ</th> <th>email</th>

</thead>

<tr>

<td><span datafld="nid"></span></td>

<td><span datafld="area"></span></td>

<td><span datafld="salename"></span></td>

<td><span datafld="phone"></span></td>

<td><span datafld="qq"></span></td>

<td><span datafld="email"></span></td>

</tr>

</table>

</body>

</html>

xml文件如下:

<xml version="10">

<!DOCTYPE tables[

<!ELEMENT tables (table)>

<!ELEMENT table(nid, area, salename, phone,qq,email)>

<!ELEMENT nid (#PCDATA)>

<!ELEMENT area (#PCDATA)>

<!ELEMENT salename (#PCDATA)>

<!ELEMENT phone (#PCDATA)>

<!ELEMENT qq (#PCDATA)>

<!ELEMENT email (#PCDATA)>

]>

<tables>

<table>

<nid>1</nid>

<area>广东深圳</area>

<salename>张XX</salename>

<phone>0755-265XXXX1,1382XXX409</phone>

<qq>12XXX88</qq>

<email>TSXXX@c-sctcom</email>

</table>

<table>

<nid>1</nid>

<area>广东深圳</area>

<salename>张XX</salename>

<phone>0755-265XXXX1,1382XXX409</phone>

<qq>12XXX88</qq>

<email>TSXXX@c-sctcom</email>

</table>

<table>

<nid>1</nid>

<area>广东深圳</area>

<salename>张XX</salename>

<phone>0755-265XXXX1,1382XXX409</phone>

<qq>12XXX88</qq>

<email>TSXXX@c-sctcom</email>

</table>

</tables>

第一种:使用XPath

XML的路径我配置在webconfig

的appSettings节点

Hashtable ht = new Hashtable();

string orgCodePath = ServerMapPath(ConfigurationSettingsAppSettings["orgCodePath"]);

//string orgCodePath = ServerMapPath("//template/home/orgCodexml");

XmlDocument xmldoc = new XmlDocument();

xmldocLoad(orgCodePath);

//获取节点列表

XmlNodeList topM = xmldocSelectNodes("//Organization");

foreach (XmlElement element in topM)

{

string id = elementGetElementsByTagName("ID")[0]InnerText;

string domainName = elementGetElementsByTagName("DomainName")[0]InnerText;

htAdd(id, domainName);

}

第二种:遍历式读取XML

//打开某文件(假设webconfig在根目录中)

string filename=ServerMapPath("/") + @"WebApplication1/webconfig";

XmlDocument xmldoc= new XmlDocument();

xmldocLoad(filename);

//得到顶层节点列表

XmlNodeList topM=xmldocDocumentElementChildNodes;

foreach(XmlElement element in topM)

{

if(elementNameToLower()=="appsettings")

{

//得到该节点的子节点

XmlNodeList nodelist=elementChildNodes;

if ( nodelistCount >0 )

{

//DropDownList1ItemsClear();

foreach(XmlElement el in nodelist)//读元素值

{

//DropDownList1ItemsAdd(elAttributes["key"]InnerXml);

//thisTextBox2Text=elAttributes["key"]InnerText;

thisTextBox2Text=elAttributes["key"]Value;

thisLabel1Text=elAttributes["value"]Value;

//同样在这里可以修改元素值,在后面save。

// elAttributes["value"]Value=thisTextBox2Text;

}

}

}

}

xmldocSave(filename);

读取xml任意节点

XmlNode node=docSelectSingleNode("/configuration/appSettings/add"); //按照节点目录查询

if(node!=null)

{

string k=nodeAttributes["key"]Value;

string v=nodeAttributes["value"]Value;

node=null;

}

XmlNode node=docSelectSingleNode("/configuration/appSettings/add");

if(node!=null)

{

XmlNodeReader nr=new XmlNodeReader(node);

nrMoveToContent();

//检查当前节点是否是内容节点。如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。

nrMoveToAttribute("value");

string s=nrValue;

node=null;

}

可以通过元素中的getText方法获取到节点的内容。

举例:

SAXReader sax = new SAXReader();

Document document = saxread(reader);//reader为定义的一个字符串,可以转换为xml

Element root = documentgetRootElement();//获取到根节点元素String str = root getText()//获取到节点的内容

用到的是dom4j-161jar,需要引入的包是:

import orgdom4jDocument;

import orgdom4jDocumentException;

import orgdom4jElement;

import orgdom4jioSAXReader;

备注:如果是多个子节点可以通过”Element xx=root element("code")“获取到子节点的元素,前提是需要知道子节点的名称。

以上就是关于C++ 如何获取 XML数据全部的内容,包括:C++ 如何获取 XML数据、SQLServer读取XML文件的做法、html怎么读取xml里的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9288345.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存