gpt4 book ai didi

c++ - 如何在 C++ 中实现通用 DOM 数据结构?

转载 作者:可可西里 更新时间:2023-11-01 16:22:01 24 4
gpt4 key购买 nike

我正在尝试编写一个非常简单的文档对象模型库实现,以便提供一个通用数据结构以在我的进一步项目中使用。为了简单起见,我只定义了三个主要类:node , elementattribute .节点由其名称定义(例如所有 html 标签),基本上是一个元素的容器,可以是文本和子节点(存储在 std::vector<node> 中)。

我只是不知道如何定义整个树结构。

我需要为我引用的类模板化接口(interface)。

使用示例:

element<string> txt1("Some text");

element< element<string> > div1("div", txt1);

我不想创建完全支持 XML 的完整 DOM 抽象级别。我只需要想法以类似 DOM 的方式组织信息。无需解析。

提前致谢!

最佳答案

与其尝试根据每个节点的父节点数量强类型化,不如将代码组织为树结构:

class Element
{
public:
std::string Name;
std::map<std::string, std::string, std::less<std::string> > Attributes;
std::list<Element> Children;
};

您的公共(public)界面可能看起来与此大不相同。我只是想展示一般类型布局。

您实际上并不需要 Node 或 Attribute 功能,除非您需要在集合中与元素一起迭代它们。这对于 XML DOM 库来说是一个有用的特性,但如果您只是想创建一个数据结构,则不必严格遵循 DOM 设计。

事实上,如果你只是想要一个通用的数据结构,你可能只需要一个属性包:

#include<map>
#include<string>
#include<iostream>

class PropertyBag;
typedef std::map<std::string, PropertyBag> PropertyMap;

class PropertyBag : public PropertyMap
{
public:
PropertyBag(const std::string& value)
: value(value)
{
}

PropertyBag& operator=(const std::string& value)
{
this->value = value;
return *this;
}

operator std::string& () { return value; }

private:
std::string value;

friend PropertyMap::mapped_type& PropertyMap::operator[](const PropertyMap::key_type&);
PropertyBag() { }
};

void SomeFunction(const std::string& value)
{
std::cout << value << "\n";
}

int main(int argc, char* argv[])
{
PropertyBag config("configuration root");
config["child1"] = "value1";
config["child1"]["subchild1"] = "value2";

SomeFunction(config["child1"]);
SomeFunction(config["child1"]["subchild1"]);
return 0;
}

只是谈论语法,您还可以尝试通过重载 operator() 和/或链接方法来获得技巧:

PropertyBag& SomeMethod(const std::string& someParam)
{
// do something here...
return *this;
}

PropertyBag& operator()(const std::string& p1, const std::string& p2)
{
// ...
return *this;
}

// ...

Configuration config1("root")
.SomeMethod("p1")
.SomeMethod("p2");
Configuration config2("root")
("Something", "blah")
("sizzle", "V2");

我认为文本/代码重复越少越好。您的代码越接近 JSON 或 YAML 之类的语法就越好。

一旦 c++0x 发布,您可能会有更简单的选择。您还可以查看 boost::assign library用于您的数据结构的简单初始化语法。

您还可以查看 boost::any library对于可以用作值的数据类型,而不是字符串(支持插入任何值的类型安全方法,只要您将其提取为相同类型)。

关于c++ - 如何在 C++ 中实现通用 DOM 数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3951307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com