QDomElement text()不要子元素
时间: 2024-04-15 09:30:52 浏览: 41
你可以使用QDomElement的text()方法来获取元素的文本内容。如果你不想获取子元素的文本内容,你可以在调用text()方法之前先移除子元素。下面是一个示例代码:
```cpp
QDomElement element = ...; // 获取需要操作的元素
// 移除子元素
while (element.firstChildElement().isNull() == false) {
element.removeChild(element.firstChildElement());
}
// 获取元素的文本内容
QString text = element.text();
```
在这个示例中,我们先通过逐个移除子元素的方式,将所有子元素从元素中移除。然后再调用text()方法获取元素的文本内容。这样就可以确保只获取到元素自身的文本内容,而不包括子元素的文本内容。
相关问题
QDomElement 修改节点文本
QDomElement 类提供了 `QDomElement::firstChild()` 函数和 `QDomNode::toText()` 函数,可以用来获取节点的文本内容,并提供了 `QDomCharacterData::setData()` 函数用于修改节点的文本内容。
具体操作步骤如下:
1. 获取要修改文本的元素节点,可以使用 `QDomDocument::firstChildElement()` 函数或 `QDomNode::firstChildElement()` 函数等获取元素节点的函数。
2. 使用 `QDomElement::firstChild()` 函数获取该元素节点的第一个子节点。
3. 使用 `QDomNode::toText()` 函数将该子节点转换成文本节点。
4. 使用 `QDomCharacterData::setData()` 函数修改文本节点的文本内容。
示例代码如下:
```cpp
QDomElement element = document.firstChildElement("root").firstChildElement("book");
QDomNode textNode = element.firstChild();
QDomText text = textNode.toText();
text.setData("New Text");
```
以上代码将修改 `root` 元素节点下的第一个 `book` 元素节点的文本内容为 "New Text"。需要注意的是,如果该元素节点下有多个子节点,那么 `QDomElement::firstChild()` 函数只会获取到第一个子节点,如果要获取其他子节点,可以使用 `QDomNode::nextSibling()` 函数等。
Qt代码实现解析xml文件<每个QDomElement带多个属性>到Qtreeview,使用MVC模式来实现QTreeView的项来增删改,并能使xml文件的QDomElement的属性跟随变化,完成编辑后实现flush(),并对文件进行重写
以下是一个简单的示例代码,演示了如何使用Qt的MVC模式来实现从XML文件加载数据到QTreeView中,并对其进行编辑和保存。
首先,我们需要创建一个QDomDocument对象并将其加载到XML文件中:
```cpp
QDomDocument doc("mydoc");
QFile file("myxml.xml");
if (!file.open(QIODevice::ReadOnly))
return;
if (!doc.setContent(&file)) {
file.close();
return;
}
file.close();
```
然后,我们可以获取根元素并使用QDomElement的子元素和属性来填充QStandardItemModel:
```cpp
QStandardItemModel *model = new QStandardItemModel();
QDomElement root = doc.documentElement();
QStandardItem *rootItem = new QStandardItem(root.tagName());
model->appendRow(rootItem);
for (QDomElement child = root.firstChildElement(); !child.isNull(); child = child.nextSiblingElement()) {
QStandardItem *childItem = new QStandardItem(child.tagName());
rootItem->appendRow(childItem);
for (QDomAttr attr = child.attributes().first(); !attr.isNull(); attr = attr.nextSibling()) {
QStandardItem *attrItem = new QStandardItem(attr.name());
QStandardItem *valueItem = new QStandardItem(attr.value());
childItem->appendRow(QList<QStandardItem*>() << attrItem << valueItem);
}
}
```
接下来,我们可以设置QTreeView以显示模型:
```cpp
QTreeView *treeView = new QTreeView();
treeView->setModel(model);
```
为了使元素属性能够随着编辑而变化,我们可以在QStandardItemModel中设置setData()函数:
```cpp
void MyStandardItemModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (role == Qt::EditRole) {
QStandardItemModel::setData(index, value, role);
QDomElement element = m_domElementList[index.row()];
if (index.column() == 0) {
element.setAttribute(value.toString(), element.attribute(m_headerList[0]));
element.removeAttribute(m_headerList[0]);
m_headerList[0] = value.toString();
}
else if (index.column() == 1) {
element.setAttribute(m_headerList[index.column()], value.toString());
}
}
}
```
在这个函数中,我们首先调用QStandardItemModel的setData()函数来更新视图,并使用QDomElement的setAttribute()和removeAttribute()函数来更新XML文件中的元素属性。对于第一列(即属性名称),我们还需要更新m_headerList以反映所做的更改。
最后,我们可以在窗口关闭时将更改保存回XML文件:
```cpp
void MainWindow::closeEvent(QCloseEvent *event)
{
QFile file("myxml.xml");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
return;
QTextStream out(&file);
doc.save(out, 4);
file.close();
}
```
这样,我们就可以使用MVC模式从XML文件加载数据到QTreeView中,并对其进行编辑和保存。完整代码示例如下:
```cpp
#include <QtWidgets>
class MyStandardItemModel : public QStandardItemModel
{
public:
MyStandardItemModel(QDomElement root, QObject *parent = nullptr)
: QStandardItemModel(parent), m_root(root)
{
m_headerList << "Name" << "Value";
m_domElementList << root;
QStandardItem *rootItem = new QStandardItem(root.tagName());
appendRow(rootItem);
for (QDomElement child = root.firstChildElement(); !child.isNull(); child = child.nextSiblingElement()) {
m_domElementList << child;
QStandardItem *childItem = new QStandardItem(child.tagName());
rootItem->appendRow(childItem);
for (QDomAttr attr = child.attributes().first(); !attr.isNull(); attr = attr.nextSibling()) {
QStandardItem *attrItem = new QStandardItem(attr.name());
QStandardItem *valueItem = new QStandardItem(attr.value());
childItem->appendRow(QList<QStandardItem*>() << attrItem << valueItem);
}
}
}
void setData(const QModelIndex &index, const QVariant &value, int role) override
{
if (role == Qt::EditRole) {
QStandardItemModel::setData(index, value, role);
QDomElement element = m_domElementList[index.row()];
if (index.column() == 0) {
element.setAttribute(value.toString(), element.attribute(m_headerList[0]));
element.removeAttribute(m_headerList[0]);
m_headerList[0] = value.toString();
}
else if (index.column() == 1) {
element.setAttribute(m_headerList[index.column()], value.toString());
}
}
}
private:
QDomElement m_root;
QStringList m_headerList;
QList<QDomElement> m_domElementList;
};
class MainWindow : public QMainWindow
{
public:
MainWindow(QWidget *parent = nullptr)
: QMainWindow(parent)
{
QDomDocument doc("mydoc");
QFile file("myxml.xml");
if (!file.open(QIODevice::ReadOnly))
return;
if (!doc.setContent(&file)) {
file.close();
return;
}
file.close();
MyStandardItemModel *model = new MyStandardItemModel(doc.documentElement());
QTreeView *treeView = new QTreeView();
treeView->setModel(model);
setCentralWidget(treeView);
}
protected:
void closeEvent(QCloseEvent *event) override
{
QFile file("myxml.xml");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
return;
QTextStream out(&file);
doc.save(out, 4);
file.close();
}
private:
QDomDocument doc;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
```
阅读全文