tinyxml2使用中DeepClone函数和InsertAfterChild函数的两个问题

cky77 2018-09-14 05:06:55
RT,我有两个xml文件A.XML和B.xml
A.xml:
{
<root>
//插入的内容在这里
</root>
}
B.xml
{
<root>
<item1>中间包含很多节点和内容</item1>
<item2>中间包含很多节点和内容</item2>
<item3>中间包含很多节点和内容</item3>
</root>
}

我想要做的是根据一个根据一个序列比如2、1、3。在B.xml中找出对应的节点复制到A.xml的<root>节点中去。

第一个问题:在编码过程中,DeepClone函数在读取到B.xml中最后一个节点也就是3时,会报错:
0x004DEAFC 处有未经处理的异常(在 XMLParse.exe 中): 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
中断发生位置在XMLNode* clone = this->ShallowClone(target);
XMLNode* XMLNode::DeepClone(XMLDocument* target) const
{
XMLNode* clone = this->ShallowClone(target);
在读取B.xml的非最后一个节点时都是正常的。

第二个问题:在向A.xml插入节点时docXmltestPJ.InsertAfterChild(vernier, copy);第一个参数报错。vernier为要插入的节点的前一个兄弟节点。 afterThis->_parent != this这一句判断完就返回0了。导致插入不成功

XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis )
{
TIXMLASSERT( addThis );
if ( addThis->_document != _document ) {
TIXMLASSERT( false );
return 0;
}

TIXMLASSERT( afterThis );

if ( afterThis->_parent != this ) {
TIXMLASSERT( false );
return 0;
}

想请教各位,1能不能解释这两个问题。2有没有用tinyxml2实现我要的功能的代码。感谢
...全文
548 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cky77 2018-09-17
  • 打赏
  • 举报
回复
引用 8 楼 worldy 的回复:
root还能有多个?

大哥我要急死了,我表述的不清楚吗...
cky77 2018-09-17
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
{
<root>
//之前的节点,比如有item1、item2、item3
</root>
<新插入的节点></新插入的节点>
}

你是打算创建多个root?


这个是afterThis填写<root>时是这样,但是我要的不是这样。但是afterthis填写<子节点n的时候>InsertAfterChild函数的判断语句会通不过。
我说的够清楚了吧
cky77 2018-09-17
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
{
<root>
//之前的节点,比如有item1、item2、item3
</root>
<新插入的节点></新插入的节点>
}

你是打算创建多个root?


不是的。可能我没说清楚
A.xml
{
<root>
<root子节点1></root子节点1>
......
<root子节点n></root子节点n>
//我是想在这里加入节点。
</root>
}
worldy 2018-09-17
  • 打赏
  • 举报
回复
{
<root>
//之前的节点,比如有item1、item2、item3
</root>
<新插入的节点></新插入的节点>
}

你是打算创建多个root?
worldy 2018-09-17
  • 打赏
  • 举报
回复
root还能有多个?
worldy 2018-09-17
  • 打赏
  • 举报
回复
A.xml
{
<root> -------假设这个节点为pNodParent
<root子节点1></root子节点1>----------节点为pafterThis,
......
<root子节点n></root子节点n>
//我是想在这里加入节点。这个节点为pNewNod
</root>
}

你的代码应该是:pNodParent->InsertAfterChild( pafterThis, pNewNod);
worldy 2018-09-17
  • 打赏
  • 举报
回复
A.xml
{
<root> -------假设这个节点为pNodParent
<root子节点1></root子节点1>
......
<root子节点n></root子节点n> ----------节点为pafterThis, 应该是这个位置的节点
//我是想在这里加入节点。这个节点为pNewNod
</root>
}

你的代码应该是:pNodParent->InsertAfterChild( pafterThis, pNewNod);
cky77 2018-09-16
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
第一问题,你访问了空指针
第二个问题,你必须通过afterThis这个节点的父节点添加addThis

我之前afterThis,位置是填的A.xml 的<root>节点子节点的最后一个,但是在InsertAfterChild函数中
afterThis->_parent != this这一句判断完就返回0了。导致插入不成功

XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis )
{
TIXMLASSERT( addThis );
if ( addThis->_document != _document ) {
TIXMLASSERT( false );
return 0;
}

TIXMLASSERT( afterThis );

if ( afterThis->_parent != this ) {
TIXMLASSERT( false );
return 0;
}
感觉就是传的参数不对,不知道该传哪个
cky77 2018-09-16
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
第一问题,你访问了空指针
第二个问题,你必须通过afterThis这个节点的父节点添加addThis

您好,第二个问题。您说的必须通过afterThis这个节点的父节点添加addThis是什么意思呢?
是说afterThis应该是addThis的父节点吗?
我试了一下afterThis填A.xml的根节点<root>,InsertAfterChild之后A.xml变成
{
<root>
//之前的节点,比如有item1、item2、item3
</root>
<新插入的节点></新插入的节点>
}
我是想把AddThis加入到<root>子节点中最后一个位置。。请大佬赐教
worldy 2018-09-16
  • 打赏
  • 举报
回复
第一问题,你访问了空指针
第二个问题,你必须通过afterThis这个节点的父节点添加addThis
cky77 2018-09-15
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
http://www.it1352.com/495950.html

我之前参考了这个,之后出现的这两个问题。网上也没找到相关的其它资料了
zgl7903 2018-09-15
  • 打赏
  • 举报
回复
cky77 2018-09-14
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
首先在调用函数之前应该判断参数指针是否是空指针

呃....您知道问题所在吗?可不可以给个详细的解答?
zgl7903 2018-09-14
  • 打赏
  • 举报
回复
首先在调用函数之前应该判断参数指针是否是空指针

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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