C++修改XML问题

「已注销」 2011-09-27 05:43:04
公司让我实现C++去添加删除修改XML的属性、节点等数据,不知道如何下手,目前想用的是Expat包,不过在遍历数据的时候不知道怎么弄好,是直接遍历一遍,有的就修改没有的就在最后添加么?这个问题没搞明白,望各位师父赐教。大概的思路、伪代码、源代码都可,先实现能修改的,以后再加入其他的快速搜索功能。。。.
...全文
629 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
CppCoder 2011-10-11
  • 打赏
  • 举报
回复
用tinyXml可以实现,这个库就是用DOM方式的,在初始化时,把XML文件的内容载入到内存,通过在内存中操作XML文件对应的数据结构管理XML包含的数据,操作结束把树保存到XML文件。编程简单,内存占用较大

还有SAX方式,通过回调通知XML节点状态变更。内存占用较小,但编程复杂。

可以调查一下数据结构里的深/广度优先遍历树,实现查询
sdl2005lyx 2011-10-11
  • 打赏
  • 举报
回复
CMap是内存块,IDOMDocumentPtr也是,只是你不熟悉它怎么使用而已,后者一样可以快速查询!
「已注销」 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sdl2005lyx 的回复:]

其实,用IDOMDocumentPtr对象,Load(xmlFile),你就已经把数据读到内存了,后面直接用IDOMDocumentPtr去检索你需要的数据,干嘛还去建表?
[/Quote]

建表是为了查询,如果里面信息有几千个呢?或者更多,那用户一多不是系统崩溃了么?必须通过技术手段在内存中做个排序索引什么的,这样才方面用啊。
sdl2005lyx 2011-10-11
  • 打赏
  • 举报
回复
其实,用IDOMDocumentPtr对象,Load(xmlFile),你就已经把数据读到内存了,后面直接用IDOMDocumentPtr去检索你需要的数据,干嘛还去建表?
「已注销」 2011-10-11
  • 打赏
  • 举报
回复
Excel文件转换成的xml,如下内容
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<LastAuthor>Mr.X</LastAuthor>
<Created>2011-09-21T08:38:06Z</Created>
<LastSaved>2011-09-29T06:00:28Z</LastSaved>
<Version>12.00</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>10005</WindowHeight>
<WindowWidth>10005</WindowWidth>
<WindowTopX>120</WindowTopX>
<WindowTopY>135</WindowTopY>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Center"/>
<Borders/>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s62">
<Alignment ss:Vertical="Center"/>
<Borders/>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
<Interior/>
<NumberFormat/>
<Protection ss:Protected="0"/>
</Style>
<Style ss:ID="s63">
<Alignment ss:Vertical="Center"/>
<Borders/>
<Interior/>
<NumberFormat/>
<Protection ss:Protected="0"/>
</Style>
<Style ss:ID="s64">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
</Style>
<Style ss:ID="s65">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders/>
<Interior/>
<NumberFormat/>
<Protection ss:Protected="0"/>
</Style>
</Styles>
<Worksheet ss:Name="Page 1">
<Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="5" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
<Column ss:AutoFitWidth="0" ss:Width="125.25"/>
<Column ss:AutoFitWidth="0" ss:Width="111"/>
<Column ss:StyleID="s62" ss:AutoFitWidth="0" ss:Width="99"/>
<Column ss:AutoFitWidth="0" ss:Width="67.5"/>
<Column ss:AutoFitWidth="0" ss:Width="141"/>
<Column ss:AutoFitWidth="0" ss:Width="117"/>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s64"><Data ss:Type="String">电子监控交通违章公告</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">号牌号码</Data></Cell>
<Cell ss:StyleID="s65"><Data ss:Type="String">号牌类型</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">违章类型</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">违章地点</Data></Cell>
<Cell ss:StyleID="s64"><Data ss:Type="String">违章时间</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2"><Data ss:Type="String">贵E30589</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">大型汽车</Data></Cell>
<Cell><Data ss:Type="String">乱停乱放</Data></Cell>
<Cell><Data ss:Type="String">沙井街/北京路</Data></Cell>
<Cell><Data ss:Type="String">2004-06-0809:36:29</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2"><Data ss:Type="String">贵E30589</Data></Cell>
<Cell><Data ss:Type="String">大型汽车</Data></Cell>
<Cell><Data ss:Type="String">乱停乱放</Data></Cell>
<Cell><Data ss:Type="String">沙井街/北京路</Data></Cell>
<Cell><Data ss:Type="String">2004-06-0815:49:58</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2"><Data ss:Type="String">贵E30579</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">大型汽车</Data></Cell>
<Cell><Data ss:Type="String">乱停乱放</Data></Cell>
<Cell><Data ss:Type="String">沙井街/北京路</Data></Cell>
<Cell><Data ss:Type="String">2004-06-0917:44:07</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="2"><Data ss:Type="String">贵E20798</Data></Cell>
<Cell><Data ss:Type="String">大型汽车</Data></Cell>
<Cell><Data ss:Type="String">乱停乱放</Data></Cell>
<Cell><Data ss:Type="String">沙井街/北京路</Data></Cell>
<Cell><Data ss:Type="String">2004-06-1009:14:55</Data></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Unsynced/>
<Selected/>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>7</ActiveRow>
<ActiveCol>5</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
<AllowFormatCells/>
<AllowSizeCols/>
<AllowSizeRows/>
</WorksheetOptions>
</Worksheet>
</Workbook>

怎么读取车牌一栏跟违章类型做一个hash、表呢,问题是tinyXML无法读取表里面的内容啊~~~难道非要C#的XML么?
sdl2005lyx 2011-10-10
  • 打赏
  • 举报
回复
楼主,下面是我整理,你看看:

C++XML访问技术
「已注销」 2011-10-10
  • 打赏
  • 举报
回复
哦,情况明朗了。

<Csdn>
<name File="test1">读取内容</name>
<name File="test2">对应关系</name>
</Csdn>
<Csdn>
...
</Csdn>

只要读取到数据,"读取内容","对应关系" 形成一个哈希表就可以了,
有人能给个实例代码么?
caddor2011 2011-10-04
  • 打赏
  • 举报
回复
tinyXMl绝对可以做到。。。


我当时不用属性,而是这样的:

<name>张三</name>

修改成:<name>里斯</name>



我当时是这样存储的,是可以修改。。。。


没有用任何属性






[Quote=引用 6 楼 jha334201553 的回复:]

修改函数里面输入的应该是什么呢?
比如如下:
<name File="test" ID="go out"></name>
要修改成
<name File="test" ID="id1"></name>
或者改成
<name File="test" ID="go out" type="sace" ></name>

这个具体的输入应该是什么样的,是整条语句么,还是:name ID=……
[/Quote]
向立天 2011-09-29
  • 打赏
  • 举报
回复
CMarkup是开源的
你可以参考一下自己实现一个
我以前的公司就这么干过
「已注销」 2011-09-29
  • 打赏
  • 举报
回复
难道TinyXML是大势所趋么,可惜现在基本用Expat实现了基本功能,如果要改<name File="test" ID="go out">in_string</name>里面的in_string我就头疼了。。。
maoxing63570 2011-09-28
  • 打赏
  • 举报
回复
http://blog.csdn.net/clever101/article/details/5334369
maoxing63570 2011-09-28
  • 打赏
  • 举报
回复
呵呵,用tinyXML吧,不过,貌似你得学下DOM树
xufeizhi254 2011-09-28
  • 打赏
  • 举报
回复
学习的。。。。
jamseyang 2011-09-28
  • 打赏
  • 举报
回复
别听你老总扯蛋,实现功能就行了,你用TinyXML试试。
FoxBryant 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 aa_qq110 的回复:]
我用过tinyxml,感觉好可以,可以下个例子试试。。
开源的
[/Quote]

支持~
秦剑 2011-09-27
  • 打赏
  • 举报
回复
我用过tinyxml,感觉好可以,可以下个例子试试。。
开源的
caddor2011 2011-09-27
  • 打赏
  • 举报
回复
个人认为用xml存储 配置信息的时候,没有必要指明属性




[Quote=引用楼主 jha334201553 的回复:]
公司让我实现C++去添加删除修改XML的属性、节点等数据,不知道如何下手,目前想用的是Expat包,不过在遍历数据的时候不知道怎么弄好,是直接遍历一遍,有的就修改没有的就在最后添加么?这个问题没搞明白,望各位师父赐教。大概的思路、伪代码、源代码都可,先实现能修改的,以后再加入其他的快速搜索功能。。。.
[/Quote]
tzxx 2011-09-27
  • 打赏
  • 举报
回复
用过一个XML解析库:CMarkUp。
查找数据的话有Find方法,可以试试能否满足你的要求。

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧