怎麼樣把我下面的xml格式的文件里面的结点中值循环读出来

CQP 2005-07-13 04:11:27
<?xml version="1.0" standalone="yes"?>
<InOutStore xmlns="http://tempuri.org/InOutStore.xsd">
<OutStore>
<code>6900916200010</code>
<time>2005-7-11 20:47:54</time>
</OutStore>
<OutStore>
<code>1P25-68596-01</code>
<time>2005-7-11 20:48:10</time>
</OutStore>
<OutStore>
<code>6901028337168</code>
<time>2005-7-11 20:48:20</time>
</OutStore>
<OutStore>
<code>6901028337168</code>
<time>2005-7-11 20:48:32</time>
</OutStore>
<OutStore>
<code>6901028337168</code>
<time>2005-7-11 20:48:41</time>
</OutStore>
<PocketId>
<pid>001</pid>
</PocketId>
</InOutStore>

分不夠,可以再加
...全文
308 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
h705c 2005-07-16
遍历一下即可
getChildren
getChild
回复
goodboyws 2005-07-14
发了,请查收
回复
qrlvls 2005-07-14
使用导入的方法导入 XML 是最简单的

从SQL Server中读取XML文件
作者: Builder.com
2005-02-17 10:48 AM

SQL Server 2000使得以XML导出数据变得更加简单,但在SQL Server 2000中导入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],[flagsbyte[in]])

[WITH (SchemaDeclaration | TableName)]

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

现在我们已经到达了最后的步骤。所有剩下的工作就是导入一个实际的XML文件到SQL并进行处理(很奇快为什么所有的BOL示例都没有涉及到这一关键的部分)。

(我必须感谢我的同事Billy Pang所给予的帮助。他帮助我解决这个问题,并给出了代码——尽管出于本文需要我对代码进行了裁减。谢谢Billy!)

基本的技巧是,将文件逐行按文本读取。然后把所有读取的行连接为一个大的VARCHAR变量。最后,将变量传递给前面所说的代码。

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

DECLARE @FileName varchar(255)

DECLARE @ExecCmd VARCHAR(255)

DECLARE @y INT

DECLARE @x INT

DECLARE @FileContents VARCHAR(8000)

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

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 = 0

WHILE @x <> @y

BEGIN

SET @x = @x + 1

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

= @x

END

SELECT @FileContents as FileContents

DROP TABLE #tempXML

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

有了这种解决办法,对XML文档进行各种处理就成为了可能。你可以将XML文档同SQL表格连接在一起而无需导入数据,然后对这些数据进行INSERT、PDATE和DELETE等任何操作。

你只需要实现存储过程的调用就可以了,用ADO调用存储过程的方法
http://www.codeproject.com/database/genericdbcall.asp
回复
goodboyws 2005-07-13
不是已经给了例子了么, 假设你的文件叫xxxx.xml
运行一下代码,可以读出数据
#if !defined(__MSXML3__)

#define __MSXML3__

#import "msxml3.dll"
using namespace MSXML2;
#endif

IXMLDOMDocument2Ptr xml;
xml.CreateInstance(__uuidof(MSXML2::DOMDocument));
xml->load("xxxx.xml");

CStringArray timeA, codeA;

int i= 1;
BOOL bNode = TRUE;
while (bNode)
{

IXMLDOMNodePtr node;
CString strRoot;

strRoot.Format("/InOutStore/OutStore[%d]", i++);
node=xml->selectSingleNode(_bstr_t("/InOutStore/OutStore[1]"));
if (node)
{
IXMLDOMNodePtr nodeCode, nodeTime;
VARIANT value;
CString strCode = strRoot + "/code";
nodeCode=xml->selectSingleNode(_bstr_t(strCode));
nodeCode->get_nodeTypedValue(&value);

CString str1(value.bstrVal);
SysFreeString(value.bstrVal);
codeA.Add(str1);
CString strTime = strRoot + "/time";
nodeTime=xml->selectSingleNode(_bstr_t(strTime ));
nodeTime->get_nodeTypedValue(&value);

CString str2(value.bstrVal);
SysFreeString(value.bstrVal);
timeA.Add(str2);
}
else
bNode = FALSE;
}
回复
CQP 2005-07-13
to: goodboyws(深夜不眠者)
能提供一个例子嘛
回复
goodboyws 2005-07-13
node=xml->selectSingleNode(_bstr_t("/InOutStore/OutStore[2]/code"));
取第二个,依次类推
回复
goodboyws 2005-07-13
xml.CreateInstance(__uuidof(MSXML2::DOMDocument));

xml->load("xxxx.xml");
IXMLDOMNodePtr node;
node=xml->selectSingleNode(_bstr_t("/InOutStore/OutStore[1]/code"));
if (node)
{

VARIANT result;
node->get_nodeTypedValue(&result);

CString str(value.bstrVal);
SysFreeString(value.bstrVal);
return str;
}
回复
CQP 2005-07-13
我想把值遍历循环取出来写到一张sqlserver的表中有没有什么更好的方法呢?
回复
CQP 2005-07-13
<?xml version="1.0" standalone="yes"?>
<InOutStore xmlns="http://tempuri.org/InOutStore.xsd">
<InStore>
<code>1P25-68596-01</code>
<time>2005-7-12 16:34:33</time>
</InStore>
<OutStore>
<code>1P25-68596-01</code>
<time>2005-7-12 16:35:36</time>
</OutStore>
<PocketId>
<pid>001</pid>
</PocketId>
</InOutStore>

也就是分别遍历OutStore下code和time的值、
也就是分别遍历InStore下code和time的值
回复
发帖
HTML/XML
创建于2007-09-28

3054

社区成员

VC/MFC HTML/XML
申请成为版主
帖子事件
创建了帖子
2005-07-13 04:11
社区公告
暂无公告