马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
原始字符串字面量
- 原始字符串字面量是 C++ 提供的一种字符串表现法,用来简化特别字符的处置惩罚(比方换行符、反斜杠)和克制过多的转义字符。它的引入是为了让字符串更可读、更易于誊写,尤其是涉及正则表达式、文件路径等场景。
- 语法
- 原始字符串字面量以 R"delimiter(raw_characters)delimiter" 的形式表示:
- delimiter 是用户定义的分隔符,可以用任意字符,但不能包含空白字符或括号。
- raw_characters 是原始字符串的内容,所有字符将被保留原样。
复制代码
- 特点
- 支持多行字符串:原始字符串字面量可以直接包罗换行符,而无需利用 \n。
- 无需转义字符:在通例字符串中,特别字符(如换行符 \n 或双引号 ")必要用反斜杠 \ 转义。
- 机动的分隔符:如果字符串中包罗了 “)”,可以利用自界说分隔符克制辩说。
- std::string raw_str = R"delimiter(This is a raw string with ")".)delimiter";
复制代码
- 可嵌套引号:原始字符串字面量答应在字符串中直接包罗双引号。
- 利用方法同平常字符串一样。
TinyXML2
- TinyXML2 是一个轻量级的 XML 分析库,专为简朴和快速计划,恰当嵌入式体系、小型应用或必要分析/天生 XML 的步调。TinyXML2 的焦点功能包罗 XML 的读取、修改和写入。
- 跨平台:纯 C++ 编写,可在 Windows、Linux、macOS 等平台上利用。
- 无需外部依赖:仅需单个头文件和源文件(tinyxml2.h 和 tinyxml2.cpp)。
1. XML文档利用
1.1 LoadFile(const char* filename)
功能:将 XML 文档生存到文件。
参数:filename 是文件路径。
返回值:生存乐成返回 XML_SUCCESS,否则返回错误码。
- XMLDocument doc;//表示整个 XML 文件,负责加载、解析、保存。
- if (doc.LoadFile("example.xml") != XML_SUCCESS) {
- std::cerr << "Failed to load XML file!" << std::endl;
- }
复制代码 1.2SaveFile(const char* filename)
功能:将 XML 文档生存到文件。
参数:filename 是文件路径。
返回值:生存乐成返回 XML_SUCCESS,否则返回错误码。
- if (doc.SaveFile("output.xml") != XML_SUCCESS) {
- std::cerr << "Failed to save XML file!" << std::endl;
- }
复制代码 1.3RootElement()
功能:获取 XML 文档的根元素。
返回值:指向根元素的指针,如果没有根元素返回 nullptr。
- XMLElement* root = doc.RootElement();
- if (!root) {
- std::cerr << "No root element found!" << std::endl;
- } else {
- std::cout << "Root element: " << root->Name() << std::endl;
- }
复制代码 1.4Parse(const char* xml)
功能:直接分析 XML 字符串。
参数:xml 是一个 XML 格式的字符串。
返回值:分析乐成返回 XML_SUCCESS,否则返回错误码。
2.元素利用
2.1 FirstChildElement(const char* name = nullptr)
功能:获取元素的第一个子元素。如果 name 参数不为空,则返回名称匹配的第一个子元素。
参数:name 是可选参数,表现子元素的名称。
返回值:指向第一个子元素的指针,如果没有找到返回 nullptr。
- XMLElement* firstChild = root->FirstChildElement();
- if (firstChild) {
- std::cout << "First child element: " << firstChild->Name() << std::endl;
- }
复制代码 2.2 NextSiblingElement(const char* name = nullptr)
功能:获取当前元素的下一个同级元素。如果 name 参数不为空,则返回名称匹配的下一个同级元素。
参数:name 是可选参数,表现同级元素的名称。
返回值:指向下一个同级元素的指针,如果没有找到返回 nullptr。
- for (XMLElement* child = root->FirstChildElement(); child != nullptr; child = child->NextSiblingElement()) {
- std::cout << "Sibling element: " << child->Name() << std::endl;
- }
复制代码 2.3 SetName(const char* name)
功能:设置元素的名称。
参数:name 是新名称的字符串。
- element->SetName("NewName");
复制代码 2.4 DeleteChild(XMLElement* child)
功能:删除当前元素的指定子元素。
参数:child 是必要删除的子元素指针。
- root->DeleteChild(child);
复制代码 3. 属性利用
3.1SetAttribute(const char* name, const char* value)
功能:设置元素的字符串属性。
参数:name 是属性名,value 是属性值。
- element->SetAttribute("key", "value");
复制代码 3.2 Attribute(const char* name)
功能:获取元素指定名称的属性值。
参数:name 是属性名。
返回值:指向属性值的字符串指针,如果属性不存在返回 nullptr。
- const char* attrValue = element->Attribute("key");
- if (attrValue) {
- std::cout << "Attribute value: " << attrValue << std::endl;
- }
复制代码 3.3 DeleteAttribute(const char* name)
功能:删除元素指定名称的属性。
参数:name 是属性名。
- element->DeleteAttribute("key");
复制代码 4. 文本利用
4.1 SetText(const char* text)
功能:设置元素的文本内容。
参数:text 是字符串,表现要设置的文本内容。
- element->SetText("This is text content");
复制代码 4.2 GetText()
功能:获取元素的文本内容。
返回值:指向文本内容的字符串指针,如果没有文本内容返回 nullptr。
- const char* text = element->GetText();
- if (text) {
- std::cout << "Text content: " << text << std::endl;
- }
复制代码 5. 新建元素和节点
5.1 NewElement(const char* name)
功能:创建一个新的元素。
参数:name 是新元素的名称。
返回值:指向新创建的元素的指针。
- XMLElement* newElement = doc.NewElement("NewElement");
复制代码 5.2 InsertFirstChild(XMLNode* child)
功能:将一个子元素插入到当前元素的最前面。
参数:child 是要插入的子元素指针。
- root->InsertFirstChild(newElement);
复制代码 5.3 InsertEndChild(XMLNode* child)
功能:将一个子元素插入到当前元素的末端。
参数:child 是要插入的子元素指针。
- root->InsertEndChild(newElement);
复制代码 6. 错误处置惩罚
6.1 ErrorID()
功能:返回文档的错误代码。
- if (doc.ErrorID() != XML_SUCCESS) {
- std::cerr << "Error occurred: " << doc.ErrorID() << std::endl;
- }
复制代码 6.2ErrorStr()
功能:返回错误信息字符串。
- if (doc.ErrorID() != XML_SUCCESS) {
- std::cerr << "Error details: " << doc.ErrorStr() << std::endl;
- }
复制代码 附录:XML文件格式
- XML的根本结构
- 声明部分
XML文件的开头是声明,表现XML的版本和编码格式
- <?xml version="1.0" encoding="UTF-8"?>
复制代码
- 根元素
XML文件必须有且只有一个根元素,全部其他内容都嵌套在根元素中
- <root>
- <!-- 子元素 -->
- </root>
复制代码
- 元素
元素是XML的根本构成单元,通常由开始标签和竣事标签构成
- <element attribute="value">内容</element>
复制代码 属性是形貌元素的附加信息,格式为key=“value”
- <book id="1" author="Author Name">Book Title</book>
复制代码 表明用于添加阐明性笔墨
- XML规则
- 标签匹配
标签匹配:每个开始标签必须有对应的竣事标签
单标签情势必要利用斜杠
- 区分巨细写
XML区分巨细写,比方和是差异的标签。
- 属性
值必须利用引号:可以是单引号或双引号
- <person gender="male"></person>
复制代码 - 转义字符
特别字符转义符示例代码输出结果&&<text>AT&T</text><text>AT&T</text><<<text>1 < 2</text><text>1 < 2</text>>><text>3 > 2</text><text>3 > 2</text>''<attribute value='John's book' /><attribute value='John's book' />""<attribute value="He said "Hello"" /><attribute value="He said "Hello"" />定名空间
- XML 中,标署名是自由界说的,差异的 XML 文档中大概会出现雷同名称的标签。如果多个 XML 文件必要归并或扩展,很轻易发生定名辩说。定名空间为标签和属性分配一个唯一的标识符,办理了辩说标题。
- 定名空间现实上是一个唯一的 URI(Uniform Resource Identifier),通常是一个 URL(但不必要真实存在)。它标识某一组标签属于特定的上下文。
- <root xmlns="http://example.com/namespace">
- <child>Content</child>
- </root>
- <!--作用范围:没有前缀的所有标签(<root> 和 <child>)都属于这个命名空间。-->
复制代码
- <root xmlns:ns="http://example.com/namespace">
- <ns:child>Content</ns:child>
- </root>
- <!--xmlns:ns="http://example.com/namespace" 声明了带前缀的命名空间-->
- <!--标签 <ns:child> 使用了 ns 前缀,表示它属于命名空间 http://example.com/namespace-->
- <!--作用范围:只有使用了 ns: 前缀的标签。-->
复制代码
- <person xmlns:p="http://example.com/person">
- <p:name>John</p:name>
- </person>
- <product xmlns:prod="http://example.com/product">
- <prod:name>Smartphone</prod:name>
- </product>
复制代码 模式位置
简朴的XML文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- 这是一个简朴的 XML 文件,形貌书店中的册本信息 --><bookstore> <book id="1"> <title>XML Basics</title> <author>John Doe</author> <price currency="USD">29.99</price> </book> <book id="2"> <title>Learning XML</title> <author>Jane Smith</author> <price currency="EUR">39.99</price> </book></bookstore>
复制代码 复杂的XML文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- 复杂 XML 文件,形貌一个电子商务平台的订单信息 --><ecommerce xmlns="http://example.com/ecommerce" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://example.com/ecommerce ecommerce.xsd"> <order id="1001" status="shipped"> <customer> <name>John Doe</name> <email>[email protected]</email> <phone>+123456789</phone> <address> <street>123 Main St</street> <city>Springfield</city> <state>IL</state> <zipcode>62704</zipcode> <country>USA</country> </address> </customer> <items> <item id="p101"> <name>Smartphone</name> <quantity>1</quantity> <price currency="USD">699.99</price> </item> <item id="p102"> <name>Wireless Headphones</name> <quantity>2</quantity> <price currency="USD">59.99</price> </item> </items> <payment> <method>Credit Card</method> <transaction_id>TX123456789</transaction_id> <amount currency="USD">819.97</amount> </payment> <shipping> <method>Express</method> <tracking_number>EXP123456789</tracking_number> <date>2024-11-25</date> </shipping> </order></ecommerce>
复制代码 |