Go to the documentation of this file.00001
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005
00006
00007
00008
00009
00010 #include "bxml_find.h"
00011
00012
00013
00014 bool bxml_matches(const bxml_element& elm, const bxml_element& query)
00015 {
00016 if (elm.name() != query.name())
00017 return false;
00018
00019 if (elm.num_attributes() < query.num_attributes())
00020 return false;
00021
00022 for (bxml_element::const_attr_iterator a = query.attr_begin();
00023 a != query.attr_end(); ++a)
00024 {
00025 if (elm.attribute(a->first) != a->second)
00026 return false;
00027 }
00028 return true;
00029 }
00030
00031
00032
00033 bxml_data_sptr bxml_find(const bxml_data_sptr& head,
00034 const bxml_element& query)
00035 {
00036 if (head->type() != bxml_data::ELEMENT)
00037 return NULL;
00038 bxml_element* h_elm = static_cast<bxml_element*>(head.ptr());
00039 if ( bxml_matches(*h_elm, query) )
00040 return head;
00041 else {
00042
00043 for (bxml_element::const_data_iterator i = h_elm->data_begin();
00044 i != h_elm->data_end(); ++i)
00045 {
00046 bxml_data_sptr result = bxml_find(*i, query);
00047 if (result)
00048 return result;
00049 }
00050 }
00051 return NULL;
00052 }
00053
00054
00055 bool bxml_matches_by_name(const bxml_element& elm, const bxml_element& query)
00056 {
00057 if (elm.name() != query.name())
00058 return false;
00059
00060 return true;
00061 }
00062
00063
00064
00065 bxml_data_sptr bxml_find_by_name(const bxml_data_sptr& head,
00066 const bxml_element& query)
00067 {
00068 if (head->type() != bxml_data::ELEMENT)
00069 return NULL;
00070 bxml_element* h_elm = static_cast<bxml_element*>(head.ptr());
00071 if ( bxml_matches_by_name(*h_elm, query) )
00072 return head;
00073 else{
00074
00075 for (bxml_element::const_data_iterator i = h_elm->data_begin();
00076 i != h_elm->data_end(); ++i)
00077 {
00078 bxml_data_sptr result = bxml_find_by_name(*i, query);
00079 if (result)
00080 return result;
00081 }
00082 }
00083 return NULL;
00084 }
00085
00086
00087 vcl_vector<bxml_data_sptr> bxml_find_all_with_name(const bxml_data_sptr& head,
00088 const bxml_element& query)
00089 {
00090 vcl_vector<bxml_data_sptr> all_results;
00091
00092 if (head->type() != bxml_data::ELEMENT)
00093 return all_results;
00094 bxml_element* h_elm = static_cast<bxml_element*>(head.ptr());
00095 if ( bxml_matches_by_name(*h_elm, query) )
00096 return all_results;
00097 else{
00098
00099 for (bxml_element::const_data_iterator i = h_elm->data_begin();
00100 i != h_elm->data_end(); ++i)
00101 {
00102 bxml_data_sptr result = bxml_find_by_name(*i, query);
00103 if (result)
00104 all_results.push_back(result);
00105 }
00106 }
00107 return all_results;
00108 }
00109