QSDOMELEMENT를 QSTRING / CONTAINER 클래스로 변환합니다
문제
다음 XML 문서가 있습니다.
<root>
<options>
...
</options>
<children>
<child name="first">12345</child>
<child name="second">
<additionalInfo>abcd</additionalInfo>
</children>
</root>
.
"자식"노드의 문자열 표현을 얻고 배열에 추가하십시오 (XML 구문을 잃어 버리고 싶지 않으므로 .text ()는 옵션이 아닙니다). 예를 들어 첫 번째 자식은 다음과 같습니다.
QString child = "<child name="first">12345</child>";
.
필자는 다음 코드를 사용하여 요소를 가져옵니다.
QDomDocument doc;
QDomElement element;
element = xml->documentElement();
if(element.isNull() == false)
{
element = element.firstChildElement("children");
if(element.isNull()) return;
element = element.firstChildElement("child");
while(element.isNull() == false)
{
doc = element.toDocument();
if(doc.isNull() == false)
{
// save string into array
array.append(doc.toString());
}
element = element.nextSiblingElement("child");
}
}
.
문제는 doc.isnull이 항상 false를 반환한다는 것입니다 (요소를 문서로 변환 할 수없는 것처럼 보입니다). 내가 이것을 어떻게 수행 할 수있는 방법이 있습니까?
편집 :
여기에 qstring이 필수가 아니라는 것을 추가하고 싶습니다. 기본적으로 나중에 데이터를 검색하는 데 사용될 수있는 모든 클래스는 괜찮습니다 (이 노드를 저장하고 나중에 다른 개체를 초기화하도록 사용하겠습니다). 중요한 것은 원래 문서가 파괴되었을 때에도 해당 값에 액세스 할 수 있어야한다는 것입니다. 예를 들어, 나중에 나중에 액세스하는 데 사용할 수있는 일부 배열 (예 : QList)에 해당 요소를 직접 저장하는 것이 가능합니다.
해결책
내 자신의 질문에 대한 답변을 추가 할 것입니다.그 이유는 무엇입니까?하지만 문서에서 다음 기능을 놓친 것처럼 보입니다.
void qdomnode :: 저장 (qtextstream & str, int 들여 쓰기) const
노드를 문자열로 변환하는 데 필요한 모든 것이 거의 없습니다.
QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");
node.save(stream, 4 /*indent*/);
// process str
. 다른 팁
XML 형식 자체가 필요하기 때문에 QDomElement
또는 QDomDocument
가 필요하지 않습니다.QDomElement
및 QDomDocument
는 XML 문서에서 저장된 데이터를 얻는 을 얻는 데 사용됩니다.
일반적인 파일 이송이 필요합니다.
를 사용하여 파일을 엽니 다.
bool QFile::open ( OpenMode mode ) [virtual]
.
파일의 전체 내용을 읽을 수 있습니다.
QByteArray QIODevice::readAll ()
.
QString
에 할당 할 수 있습니다.
e.g.,
QString entireContents = xmlFile->readAll();
.
다음
를 사용하여 newline\n
문자를 기반으로 전체 내용을 분리 할 수 있습니다
QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
.
이제 각 인덱스는 XML 파일의 각 행에 해당합니다.당신은 그것을 통과하고 원하는 관심도를 얻을 수 있습니다.
도움이되기를 바랍니다 ...
Qt XML 클래스로 원하는 대단히 대단히 할 수는 없지만 직접 문자열을 단순히 재구성 할 수 있어야합니다 (아마 원래 100 %에서 원래 일치하지 않고 같은 의미로 원래 일치하지 않지만 같은 의미로).메소드 QT XML 클래스가 제공합니다.
편집 : 작은 코드 스 니펫 (테스트되지 않은) :
QString domElementToRawXML(const QDomElement& elem)
{
QString head = "<"+elem.tagName();
QDomNamedNodeMap attrs = elem.attributes();
for(int i = 0; i<attrs.size(); ++i)
{
QDomAttr attr = attrs.item(i).toAttr();
head +=
QString::fromLatin1(" %0=\"%1\"")
.arg(attr.name())
.arg(attr.value());
}
head += ">";
return head + elem.text() + "</"+elem.tagName()+">";
}
.