当前位置:   article > 正文

Qt5 对xml文件的读写_qt5读写xml

qt5读写xml

1.写xml文件

  1. void Sign::writeXml2( )
  2. {
  3. QString filename ="D:/ZCodeTest/Signs/Sign_0/Signature.xml";
  4. QFile file(filename);
  5. if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
  6. {
  7. qDebug()<<QObject::tr("打开失败");
  8. return;
  9. }
  10. //写入xml头部
  11. QDomDocument doc;
  12. QDomProcessingInstruction instruction; //添加处理命令
  13. instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
  14. doc.appendChild(instruction);//doc开头加入instruction
  15. //创建root根节点
  16. QDomElement root=doc.createElement("ofd:Signature");
  17. root.setAttribute("xmlns:ofd","http://www.ofdspec.org/2016"); //创建属性 其中键值对的值可以是各种类型
  18. doc.appendChild(root);//将root节点添加到doc
  19. //在root根节点下面创建子节点child
  20. QDomElement child=doc.createElement("ofd:SignedInfo"); //创建子元素
  21. //在child子节点下面创建叶子节点leaf1
  22. QDomElement leaf1 = doc.createElement("ofd:Provider");
  23. leaf1.setAttribute("ProviderName", "xxx");
  24. leaf1.setAttribute("Company", "xxxx");
  25. leaf1.setAttribute("Version","2.0");
  26. child.appendChild(leaf1); //先将leaf1节点添加到child
  27. root.appendChild(child); //再将child节点添加到根节点root
  28. //在child子节点下面创建与leaf1节点并列的leaf2节点
  29. QDomElement leaf2=doc.createElement("ofd:SignatureMethod"); //创建子元素
  30. QDomText text1; //设置括号标签中间的值
  31. text1=doc.createTextNode("1.2.840.113549.1.1.11");
  32. leaf2.appendChild(text1);
  33. child.appendChild(leaf2);
  34. //在child子节点下面创建与leaf1节点并列的leaf3节点
  35. QDomElement leaf3=doc.createElement("ofd:SignatureDateTime"); //创建子元素
  36. QDomText text2; //设置括号标签中间的值
  37. text2=doc.createTextNode("2020-04-05-10:26:38.586");
  38. child.appendChild(leaf3);
  39. leaf3.appendChild(text2);
  40. //在child子节点下面创建与leaf1节点并列的leaf4节点
  41. QDomElement leaf4 = doc.createElement("ofd:References");
  42. leaf4.setAttribute("CheckMethod", "2.16.840.1.101.3.4.2.1");
  43. child.appendChild(leaf4);
  44. //在leaf4叶子节点下面创建common节点
  45. QDomElement common = doc.createElement("ofd:References");
  46. common.setAttribute("FileRef", "/Doc_0/Signs/Sign_0/Seal.esl");
  47. QDomElement title3=doc.createElement("ofd:CheckValue"); //创建子元素
  48. QDomText text3; //设置括号标签中间的值
  49. text3=doc.createTextNode("rbhVQNUcRGVoVvIgTdcobIJZfh88R6fiI/KQHwB6mEA=");
  50. common.appendChild(title3);
  51. title3.appendChild(text3);
  52. leaf4.appendChild(common);
  53. //添加第二个子节点及其子元素,部分变量只需重新赋值
  54. common = doc.createElement("ofd:References");
  55. common.setAttribute("FileRef", "/Doc_0/Pages/Page_0/Content.xml");
  56. title3=doc.createElement("ofd:CheckValue"); //创建子元素
  57. text3=doc.createTextNode("avmJc1lYs0c/zLPcEtZmB3RQDzZpniHOL0trBV/uRBw=");
  58. common.appendChild(title3);
  59. title3.appendChild(text3);
  60. leaf4.appendChild(common);
  61. //添加第三个子节点及其子元素,部分变量只需重新赋值
  62. common = doc.createElement("ofd:References");
  63. common.setAttribute("FileRef", "/Doc_0/Document.xml");
  64. title3=doc.createElement("ofd:CheckValue"); //创建子元素
  65. text3=doc.createTextNode("SNv9vLp5bRwTd9auSEQ2+VsdIoV/C0csCdg3OFdCnKQ=");
  66. common.appendChild(title3);
  67. title3.appendChild(text3);
  68. leaf4.appendChild(common);
  69. //添加第四个子节点及其子元素,部分变量只需重新赋值
  70. common = doc.createElement("ofd:References");
  71. common.setAttribute("FileRef", "/Doc_0/PublicRes.xml");
  72. title3=doc.createElement("ofd:CheckValue"); //创建子元素
  73. text3=doc.createTextNode("v4lm6B1YSqt83ercEoKu4P/Yz2PXG548bap2b2I6sho=");
  74. common.appendChild(title3);
  75. title3.appendChild(text3);
  76. leaf4.appendChild(common);
  77. //在child子节点下面创建与leaf1节点并列的leaf5节点
  78. QDomElement leaf5 = doc.createElement("ofd:StampAnnot");
  79. leaf5.setAttribute("PageRef", "1");
  80. leaf5.setAttribute("ID", "1");
  81. leaf5.setAttribute("Boundary","86.545 67.2744 42 42");
  82. child.appendChild(leaf5);
  83. //在child子节点下面创建与leaf1节点并列的leaf6节点
  84. QDomElement leaf6 = doc.createElement("ofd:Seal");
  85. QDomElement title6=doc.createElement("ofd:BaseLoc"); //创建子元素
  86. QDomText text6=doc.createTextNode("Seal.esl");
  87. leaf6.appendChild(title6);
  88. title6.appendChild(text6);
  89. child.appendChild(leaf6);
  90. //在root根节点下面创建与子节点child并列的child2节点
  91. QDomElement child2=doc.createElement("ofd:SignedValue"); //创建子元素
  92. QDomText text7=doc.createTextNode("SignedValue.dat");
  93. root.appendChild(child2);
  94. child2.appendChild(text7);
  95. //输出到文件
  96. QTextStream out_stream(&file);
  97. doc.save(out_stream,4); //缩进4格
  98. file.close();
  99. }

2.读xml文件

  1. void Sign::readXml()
  2. {
  3. QString filename ="C:/Users/ntko/Desktop/Signature.xml";
  4. QFile file(filename);
  5. if(file.exists())
  6. {
  7. if(!file.open(QFile::ReadOnly))
  8. {
  9. qDebug()<<QObject::tr("打开失败");
  10. return ;
  11. }
  12. file.close();
  13. }
  14. else
  15. {
  16. qDebug()<<QObject::tr("该文件不存在");
  17. return ;
  18. }
  19. QDomDocument doc;
  20. if (!doc.setContent(&file))
  21. {
  22. file.close();
  23. qDebug()<<"文件解析失败";
  24. return;
  25. }
  26. QDomElement root=doc.documentElement(); //返回根节点
  27. qDebug()<<root.nodeName();
  28. QDomNode node=root.firstChild(); //获得第一个子节点
  29. qDebug()<<node.nodeName();
  30. if(!node.isNull())
  31. {
  32. if(node.isElement())
  33. {
  34. QDomElement e=node.toElement(); //转换为元素,注意元素和节点是两个数据结构,其实差不多
  35. QDomNodeList list=e.childNodes();
  36. QDomNode n=list.at(0);
  37. if(node.isElement())
  38. qDebug()<<n.nodeName()<<":"<<n.toElement().attribute("ProviderName")<<":"<<n.toElement().attribute("Company")<<":"<<n.toElement().attribute("Version");
  39. QString str=n.toElement().attribute("ProviderName");
  40. QByteArray ba = str.toLatin1();
  41. puchName=(unsigned char *)ba.data();
  42. int len= strlen((char*)puchName);
  43. piNameLen=&len;
  44. qDebug()<<len;
  45. qDebug()<<piNameLen;
  46. QDomNode n1=list.at(1);
  47. if(node.isElement())
  48. qDebug()<<n1.nodeName()<<":"<<n1.toElement().text();
  49. QDomNode n2=list.at(2);
  50. if(node.isElement())
  51. qDebug()<<n2.nodeName()<<":"<<n2.toElement().text();
  52. QDomNode n3=list.at(3);
  53. if(node.isElement())
  54. qDebug()<<n3.nodeName()<<":"<<n3.toElement().attribute("CheckMethod");
  55. //0,1,2,3 四个子节点
  56. //再把ofd:Reference中的子节点遍历出来
  57. QDomElement t=n3.toElement();
  58. QDomNodeList x=t.childNodes();
  59. for(int i=0;i<x.count();i++) //遍历子元素,count和size都可以用,可用于标签数计数
  60. {
  61. QDomNode n10=x.at(i);
  62. if(node.isElement())
  63. qDebug()<<n10.nodeName()<<n10.toElement().attribute("FileRef")<<":"<<n10.toElement().text();
  64. }
  65. //4,5 两个子节点
  66. QDomNode n4=list.at(4);
  67. if(node.isElement())
  68. qDebug()<<n4.nodeName()<<":"<<n4.toElement().attribute("PageRef")<<":"<<n4.toElement().attribute("ID")<<":"<<n4.toElement().attribute("Boundary");
  69. QDomNode n5=list.at(5);
  70. if(node.isElement())
  71. qDebug()<<n5.nodeName()<<":"<<n5.toElement().text();
  72. }
  73. }
  74. QDomNode node2=root.lastChild();//获得最后一个子节点
  75. qDebug()<<node2.nodeName()<<":"<<node2.toElement().text();
  76. }

xml格式文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ofd:Signature xmlns:ofd="http://www.ofdspec.org/2016">
  3. <ofd:SignedInfo>
  4. <ofd:Provider ProviderName="xxx" Version="2.0" Company="xxxx"/>
  5. <ofd:SignatureMethod>1.2.840.113549.1.1.11</ofd:SignatureMethod>
  6. <ofd:SignatureDateTime>2020-04-05-10:26:38.586</ofd:SignatureDateTime>
  7. <ofd:References CheckMethod="2.16.840.1.101.3.4.2.1">
  8. <ofd:References FileRef="/Doc_0/Signs/Sign_0/Seal.esl">
  9. <ofd:CheckValue>rbhVQNUcRGVoVvIgTdcobIJZfh88R6fiI/KQHwB6mEA=</ofd:CheckValue>
  10. </ofd:References>
  11. <ofd:References FileRef="/Doc_0/Pages/Page_0/Content.xml">
  12. <ofd:CheckValue>avmJc1lYs0c/zLPcEtZmB3RQDzZpniHOL0trBV/uRBw=</ofd:CheckValue>
  13. </ofd:References>
  14. <ofd:References FileRef="/Doc_0/Document.xml">
  15. <ofd:CheckValue>SNv9vLp5bRwTd9auSEQ2+VsdIoV/C0csCdg3OFdCnKQ=</ofd:CheckValue>
  16. </ofd:References>
  17. <ofd:References FileRef="/Doc_0/PublicRes.xml">
  18. <ofd:CheckValue>v4lm6B1YSqt83ercEoKu4P/Yz2PXG548bap2b2I6sho=</ofd:CheckValue>
  19. </ofd:References>
  20. </ofd:References>
  21. <ofd:StampAnnot ID="1" Boundary="86.545 67.2744 42 42" PageRef="1"/>
  22. <ofd:Seal>
  23. <ofd:BaseLoc>Seal.esl</ofd:BaseLoc>
  24. </ofd:Seal>
  25. </ofd:SignedInfo>
  26. <ofd:SignedValue>SignedValue.dat</ofd:SignedValue>
  27. </ofd:Signature>

参考文档:

XML基本语法

Qt5 对xml文件常用的操作(读写,增删改查)

QT读写改XML格式文件

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号