链接到同一文档中的另一个 XML 节点



XML 文件:

<?xml version="1.0"?>
<Common>
    <Test name="B1">
        <Test id="100"><Name>a test</Name></Test>
        <Test id="101"><Name>another test</Name></Test>
    </Test>
    <Test name="B2">
        <Test id="500"><Name>a simple test</Name></Test>
        <Test id="501"><Name>another simple test</Name></Test>
    </Test>
    <Test name="B6">
        <!-- link to B2 to avoid redundancy -->
    </Test>
</Common>

我想将<Test name"B2">的内容链接到<Test name="B6">以避免重新输入相同的数据!(不同的名称是必要的)引用此 XML 节点需要哪条语句?(Pugixml 应该能够正确解析它)

XML 不支持此类引用。您可以使用自定义"语法"和自定义C++代码来解决此问题,例如:

<?xml version="1.0"?>
<Common>
    <Test name="B1">
        <Test id="100"><Name>a test</Name></Test>
        <Test id="101"><Name>another test</Name></Test>
    </Test>
    <Test name="B2">
        <Test id="500"><Name>a simple test</Name></Test>
        <Test id="501"><Name>another simple test</Name></Test>
    </Test>
    <Test name="B6">
        <?link /Common/Test[@name='B2']?>
    </Test>
</Common>

可以加载如下代码:

bool resolve_links_rec(pugi::xml_node node)
{
    if (node.type() == pugi::node_pi && strcmp(node.name(), "link") == 0)
    {
        try
        {
            pugi::xml_node parent = node.parent();
            pugi::xpath_node_set ns = parent.select_nodes(node.value());
            for (size_t i = 0; i < ns.size(); ++i)
                parent.insert_copy_before(ns[i].node(), node);
            return true;
        }
        catch (pugi::xpath_exception& e)
        {
            std::cerr << "Error processing link " << node.path() << ": " << e.what() << std::endl;
        }
    }
    else
    {
        for (pugi::xml_node child = node.first_child(); child; )
        {
            pugi::xml_node next = child.next_sibling();
            if (resolve_links_rec(child))
                node.remove_child(child);
            child = next;
        }
    }
    return false;
}

相关内容

  • 没有找到相关文章

最新更新