2017-01-30 6 views
0

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 должен иметь возможность правильно разобрать его)

ответ

1

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; 
} 
Смежные вопросы