gpt4 book ai didi

c++ - 删除 XML 文件的特定内容

转载 作者:行者123 更新时间:2023-11-28 05:52:35 24 4
gpt4 key购买 nike

在我的 xml 文件中,我有一个节点,其子节点有 2 个属性,我必须删除 1 个整个子节点,同时只考虑 1 个属性。我在下面给出了一个例子

XML 文件:

<UMG>
<ABC Name="ABC" Value="1"></ABC>
<ABC Name="ABC1" Value="2"></ABC>
<ABC Name="ABC2" Value="3"></ABC>
<ABC Name="ABC3" Value="4"></ABC>
<ABC Name="ABC4" Value="5"></ABC>
</UMG>

我必须删除只有“Name”属性的整个子子项,因为 Value 可以更改。

到目前为止我的代码:

void::MainWindow::XML()
{
QString path = ui->lineEdit_7->text();

qDebug()<<path;
if(!file.exists() )
{
qDebug() << "Check your file";
}
QDomDocument dom;
dom.setContent(&file);
QDomNodeList nodes = dom.elementsByTagName("ABC");

QDomNodeList loc_childNodes = nodes.at(0).childNodes();

for(int i=0; i<loc_childNodes.count(); i++)
{
QDomNode node = loc_childNodes.at(i);
qDebug() << node.attributes().namedItem("Name").nodeValue(); // I get all Name attributes.

最后一个 qDebug 给了我所有的“名称”属性。我坚持使用此信息删除子项。

编辑:

<NEW>
<child>ABC<child>
<child1>ABC1<child1>
<Child3>ABC3<child3>
<NEW>

编辑2:

<MAIN>
<SUB Name = "ABC" Value = "1"/>
<SUB Name = "ABC1" Value = "0"/>
<SUB Name = "ABC2" Value = "3"/>
<Header Name = "Abc" value = "9"/>
<SUB Name = "ABC7" Value = "3"/>
<Header Name = "Abc5" value = "9"/>
<SUB Name = "ABC3" Value = "3"/>
<Header Name = "Abc0" value = "9"/>
</MAIN>

我只想删除子项的“SUB”属性。预期结果:

<MAIN>
<Header Name = "Abc" value = "9"/>
<Header Name = "Abc5" value = "9"/>
<Header Name = "Abc0" value = "9"/>
</MAIN>

编辑3:

qDebug()<<manualoutput_scr;
QString path = "File"
QFile inFile(path );
if( !inFile.open( QIODevice::ReadOnly | QIODevice::Text ) )
{
qDebug( "Failed to open file for reading." );
}

QDomDocument dom;
if( !dom.setContent( &inFile ) )
{
qDebug( "Failed to parse the file into a DOM tree." );
}

QDomElement docElem = dom.documentElement();
QDomNodeList nodes = docElem.elementsByTagName("MAIN");
QDomNodeList loc_childNodes = nodes.at(0).childNodes();
for(int i=0; i<loc_childNodes.count(); i++)
{
QDomNode node = loc_childNodes.at(i);
if( node.nodeName().compare("SUB") == 0 ) {
QDomNode parentNode = node.parentNode();
parentNode.removeChild(node);
}
}
QFile outFile( path);
if( !outFile.open( QIODevice::WriteOnly | QIODevice::Text ) )
{
qDebug( "Failed to open file for writing." );
}

QTextStream stream( &outFile );
stream << dom.toString();
outFile.close();

最佳答案

QDomNode 有方法 removeChild 可能有帮助吗?

来自文档

QDomNode QDomNode::removeChild(const QDomNode & oldChild)

Removes oldChild from the list of children. oldChild must be a direct child of this node. Returns a new reference to oldChild on success or a null node on failure.

Addition 你的代码可能看起来像下面这样

if( node.attributes().namedItem("Name").nodeValue().compare("ABC3") == 0  ) {
QDomNode parentNode = node.parentNode();
parentNode.removeChild(node);
}

添加到编辑 2

if( node.nodeName().compare("SUB") == 0  ) {
QDomNode parentNode = node.parentNode();
parentNode.removeChild(node);
}

更新到编辑 3. 替换行

QDomElement docElem = dom.documentElement();
QDomNodeList nodes = docElem.elementsByTagName("MAIN");

QDomNodeList nodes = dom.elementsByTagName("MAIN");

并且在 parent.removeChild(node) 之后添加 i-=1,因为元素的数量减少了。并且在调用 outFile.open() 之前不要忘记在 File.close() 中关闭文件("file")

关于c++ - 删除 XML 文件的特定内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34919205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com