使用Qt XmlStreamWriter写 Plist 文件

一. XML

1. 什么是xml
  • XML 代表可扩展标记语言
  • XML 是一种类似于 HTML 的标记语言
  • XML 旨在存储和传输数据
  • XML 被设计成自我描述的
  • XML 是 W3C 推荐标准
2. 什么是有效的xml

“有效”的 XML 文档是“格式良好的”,并且符合 DTD 的规则:
如以下是一个xml的例子

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
3. DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

例子:

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

以上 DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。

!ELEMENT note (第三行)定义 note 元素有四个元素:“to、from、heading,、body”

!ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型

!ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型

!ELEMENT heading (第六行)定义 heading 元素为 “#PCDATA” 类型

!ELEMENT body (第七行)定义 body 元素为 “#PCDATA” 类型

二. plist 和 xml 之间的联系

1.苹果的DTD格式
<!ENTITY % plistObject "(array | data | date | dict | real | integer | string | true | false )" >
<!ELEMENT plist %plistObject;>
<!ATTLIST plist version CDATA "1.0" >

<!-- Collections -->
<!ELEMENT array (%plistObject;)*>
<!ELEMENT dict (key, %plistObject;)*>
<!ELEMENT key (#PCDATA)>

<!--- Primitive types -->
<!ELEMENT string (#PCDATA)>
<!ELEMENT data (#PCDATA)> <!-- Contents interpreted as Base-64 encoded -->
<!ELEMENT date (#PCDATA)> <!-- Contents should conform to a subset of ISO 8601 (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'.  Smaller units may be omitted with a loss of precision) -->

<!-- Numerical primitives -->
<!ELEMENT true EMPTY>  <!-- Boolean constant true -->
<!ELEMENT false EMPTY> <!-- Boolean constant false -->
<!ELEMENT real (#PCDATA)> <!-- Contents should represent a floating point number matching ("+" | "-")? d+ ("."d*)? ("E" ("+" | "-") d+)? where d is a digit 0-9.  -->
<!ELEMENT integer (#PCDATA)> <!-- Contents should represent a (possibly signed) integer number in base 10 -->

      plist 实际是一个Apple所提供的属性列表,属性列表提供了一种结构化且有效的方式来表示对象的层次结构并将其保存到磁盘。它们在 Apple 的操作系统中广泛用于存储少量数据,最著名的例子是Info.plist,该文件包含捆绑可执行文件的键值编码配置信息。Cocoa 允许 plist 的各种可互换表示,包括 XML、JSON 和二进制。前两者具有人类可读的优势,而后者在磁盘上提供最有效的表示,以及快速的序列化/反序列化。
       其中Integer的范围为-9223372036854775808~9223372036854775807

2. Plist Example

Exampe1:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>A</key>
    <key>B</key>
    <string>sssss</string>
    <string>DDEX</string>
  </dict>
</plist>

Example2:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>A</key>
    <string>sshaw</string>
  </dict>
</plist>

三. 使用Qt XmlStreamWriter 写Plist

Qt XmlStreamWriter 注意事项

  • 构造器 使用 QXmlStreamWriter(QString *string)
    在Qt5 中会忽略 setCodec() 所设的编码,默认使用UTF-8
    在Qt6 中默认使用UTF-8

  • writeDTD() 用于写dtd格式,Apple Plist DTD 在Qt中应这么写:

stream.writeDTD("<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">");

以该plist为例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>A</key>
    <string>sshaw</string>
  </dict>
</plist>

在Qt 中的写法为

	#include <QtCore/QXmlStreamWriter>

    QByteArray output;
    QXmlStreamWriter stream(&output);
    stream.setAutoFormatting(true);
    stream.writeStartDocument();

    stream.writeDTD("<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">");
    stream.writeStartElement("plist");
    stream.writeAttribute("version","1.0");

    stream.writeStartElement("dict");
    stream.writeTextElement("key","A");
    stream.writeTextElement("string", "sshaw");
    stream.writeEndElement(); //dict

    stream.writeEndElement();// plist
    stream.writeEndDocument();

保存为plist

	QFile file("/xxx/xxx.plist");
    file.open(QIODevice::WriteOnly);
    file.resize(0);
    file.write(output);
    file.close();

生成的plist的代码为

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>A</key>
        <string>sshaw</string>
    </dict>
</plist>

在xcode 的展示为

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MStudyStudio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值