рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдЙрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрддрд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж рд╣рдо рдореЗрдВ рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рддреЛ ...
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд╕реАрдЖрд░рдПрдо рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рдЧрднрдЧ 6 рд╡рд░реНрд╖ рдкреБрд░рд╛рдиреА рд╣реИ рдФрд░ рд╡рд┐рдХрд╛рд╕ рджрд▓ рдореЗрдВ 10 рд▓реЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рднрд╛рд╖рд╛: C ++ рдФрд░ PL / SQLред
рд╣рдорд╛рд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдкреНрд▓реЗрди рдУрд▓реНрдб рдПрдХреНрд╕рдПрдордПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдРрд╕рд╛ рд╣реБрдЖред рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП XML рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдХреАрдорд╛ рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рд╡рд░реНрд╖ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЯреАрдХрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдмрдВрдзрдХ рдЕрднреА рднреА рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдкрд╢реНрдЪрд╛рддрд╛рдк рдХрд░рддрд╛ рд╣реИред рдЪрд▓реЛ ...
рд░рд╛рд╕реНрддреЗ рдХреЗ рд╕рд╛рде, рд╕рднреА рд╕реБрдзрд╛рд░ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдЬрдм рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╖реНрдЯрдкреНрд░рдж рдФрд░ рдЕрд╕рд╣рдиреАрдп рд╣реЛрддреА рд╣реИред рдЕрдм рд╡рд╣реА рд╣реБрдЖред
рдХрдИ рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдореБрдЦреНрдп рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдПрдХреНрд╕рдПрдордПрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред
рдорд╛рдирдХ рдЕрднреНрдпрд╛рд╕
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
::std::string request = clearCreateNode("book", createNode("author", "", "name='Freddy' surname='Smith'") + createNode("author", "", "name='Bill' surname='Joe'") + clearCreateNode("quote", "This is the best unknown book I've ever quoted!" + createNode("author", "", "name='Mr. Bob'")), "isbn='123456789' name='Some book' year='2011'");
рдорд╛рдирдХ рдЕрднреНрдпрд╛рд╕ред
stream
рдХреНрдпреЛрдВ рдирд╣реАрдВ? - рдХреНрдпреЛрдВрдХрд┐ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдШреЛрдВрд╕рд▓рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐,
stream
рдкрд╣рд▓реА рдЪреАрдЬрд╝ рд╣реИ рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ, рдФрд░ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП, "рдмрд╛рдИрдВ рдУрд░ рд╕рд╣реА рд╡рд╕реНрддреБ рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ" рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдареАрдХ рд╣реИ, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗред рдЖрдк рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЛ рд╕рд╣рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо
clearNode
рдпрд╛
clearCreateNode
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдирд╛рдо рдХрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА
"T"
рдкрд╛рдЧрд▓рдкрди рд╣реЛред рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдкрд╣рд▓реЗ: "рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ," рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдХреНрдп рд╕реЗ рдкрд╣рд▓реЗ, "рд╡рд╛рдХреНрдп:", рдФрд░ рд╢рдмреНрдж рд╕реЗ рдкрд╣рд▓реЗ, "рд╢рдмреНрдж:" рдФрд░ рдЗрддрдиреЗ рдкрд░ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рдкрд╛рдЧрд▓рдкрди рд╣реИ?
рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ
рдХреЛрдИ рдХрд╣реЗрдЧрд╛ рдХрд┐ XML рдЦреБрдж рдмреЗрдорд╛рдиреА рд╣реИ - рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреЛрдб рдХреЛ рдЯреИрдЧ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ...
рд╣рд╛рдВ, рдпрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╛ рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдПрдХ рдмреЗрд╡рдХреВрдл рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдмрд╛рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИред рдЬрдм рд╣рдо рджреЛрдиреЛрдВ рд╕рдВрд╡рд╛рдж рдХреЗ рд╕рдВрджрд░реНрдн рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛, рдЬрдм рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдирд┐рдпрдореЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЦрд╛рддреЗ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рдРрд╕рд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ:
with (Object) begin a := 1; b := "foobar"; end;
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ: "рдЕрдм рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА 'рдПрдХ' рд╕рдВрдкрддреНрддрд┐ рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ 'рдмреА' рд╕рдВрдкрддреНрддрд┐ рдХреЛ 'рдлреЛрдмреНрдмрд░' рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред"
"рд╡рд╕рд╛ рдХреА рдПрдХ рдмреВрдВрдж рдирд╣реАрдВ!"
XML рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛, рдпрд╣ рд╣реИ рдХрд┐ XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЗрд╕ рддрд░рд╣ рд╕реЗ DSL рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рд╕реНрдк рдореЗрдВ:
((book :isbn "123456789" :name "Some book" :year "2011") ((author :name "Freddy" :surname "Smith")) ((author :name "Bill" :surname "Joe")) (quote "This is the best unknown book I've ever quoted!" (author :name "Mr. Bob")))
рдпрджрд┐ рдЖрдк рдХреЛрд╖реНрдардХ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ "рд╡рд╕рд╛ рдХреА рдПрдХ рдмреВрдВрдж рдирд╣реАрдВ рд╣реИ!" рдЕрдЧрд░ рдЖрдк XML рдореЗрдВ <,>, /, = рд╡рд░реНрдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдорд╛рдкрди рдЯреИрдЧ рдХреЗ рдЕрддрд┐рд░реЗрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╡рд╣реА рд╕рдВрджреЗрд╢ рдорд┐рд▓реЗрдЧрд╛ред
<book isbn='123456789' name='Some book' year='2011'><author name='Freddy' surname='Smith'/><author name='Bill' surname='Joe'/><quote>This is the best unknown book I've ever quoted!<author name='Mr. Bob'/></quote></book>
рдпрд╛ рд╕реБрдВрджрд░ рдкреНрд░рд┐рдВрдЯ рдХреЗ рд╕рд╛рде:
<book isbn='123456789' name='Some book' year='2011'> <author name='Freddy' surname='Smith'/> <author name='Bill' surname='Joe'/> <quote>This is the best unknown book I've ever quoted! <author name='Mr. Bob'/> </quote> </book>
рдХреНрдпрд╛ C ++ рдореЗрдВ рдЕрд░реНрде рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?
рдкрд░рд┐рдгрд╛рдо
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣рд╛рдВ рд╡рд╣реА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрддрдГ рд╣реБрдЖ:
const xml::Tag book ("book"); const xml::Tag author ("author"); const xml::Tag quote ("quote"); xml::Element request = xml::Element() (book ("isbn", "123456789") ("name", "Some book") ("year", "2011"), xml::Element() (author ("name", "Freddy") ("surname", "Smith")) (author ("name", "Bill") ("surname", "Joe")) (quote, xml::Element() ("This is the best unknown book I've ever quoted!") (author ("name", "Mr. Bob"))));
рдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рдЪрдпрди рдХреЗ рд╕рд╛рде:
namespace library { namespace books { const xml::Tag book ("book"); const xml::Tag author ("author"); const xml::Tag quote ("quote"); } }
рдФрд░ рдлрд┐рд░:
namespace bks = ::library::books; xml::Element request = xml::Element() (bks::book ("isbn", "123456789") ("name", "Some book") ("year", "2011"), xml::Element() (bks::author ("name", "Freddy") ("surname", "Smith")) (bks::author ("name", "Bill") ("surname", "Joe")) (bks::quote, xml::Element() ("This is the best unknown book I've ever quoted!") (bks::author ("name", "Mr. Bob"))));
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрддрд┐рд░реЗрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ (рдлрд┐рд░ рднреА, рдЖрдкрдХреЛ рдЕрдиреБрд▓рдЧреНрдирдХ рдмрд┐рдВрджреБ рдкрд░
xml::Element()
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рдкреНрд░рдЧрддрд┐ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рджреЛрд╣рд░рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ TEG рд╣реИ, рдФрд░ рдЖрдк рдирд┐рд░реНрдорд╛рдгрд╛рдзреАрди рдкреВрд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдХреА рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдВрджрд░ рдкреНрд░рд┐рдВрдЯ рдпрд╛ рдХреБрдЫ рдФрд░ рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдПрдХ рдкреЗрдбрд╝ рдЖрдо рдЬрдбрд╝ред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╣рдо рдРрд╕реЗ DSL рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
Element
рд╡рд░реНрдЧ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рд╕рдВрдЪрд╛рд▓рдХ:
template <class T> void addContent(const T & content); void addEmptyTag(const Tag & tag); template <class T> void addTag(const Tag & tag, const T & content); void addTagElement(const Tag & tag, const Element & element);
Element
рдХреНрд▓рд╛рд╕ рдХреЗ DSL рдСрдкрд░реЗрдЯрд░:
template <class T> inline Element & operator () (const T & content) { addContent(content); return *this; } inline Element & operator () (const Tag & tag) { addEmptyTag(tag); return *this; } template <class T> inline Element & operator () (const Tag & tag, const T & content) { addTag(tag, content); return *this; } template <> inline Element & operator () (const Tag & tag, const Element & element) { addTagElement(tag, element); return *this; }
- рдирд╛рдо рдЯреИрдЧ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг
Tag
рд╡рд░реНрдЧ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЬреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред
рдФрд░ рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ XML рдореЗрдВ DSL рдореЗрдВ рд▓рд┐рдЦреЗ рдХреЛрдб рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ:
template <class T> void addContent(const T & content) { ::std::ostringstream oss; oss << content; buf += http_encode(oss.str()); } void addEmptyTag(const Tag & tag) { buf += createNode(tag.name, "", tag.args); } template <class T> void addTag(const Tag & tag, const T & content) { ::std::ostringstream oss; oss << content; buf += createNode(tag.name, oss.str(), tag.args); } void addTagElement(const Tag & tag, const Element & element) { buf += clearCreateNode(tag.name, element.str(), tag.args); }
рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрдХреНрд╖рд╛ рдХреЛрдб рджреЗ рджреВрдВрдЧрд╛
class Tag { public: // DSL : template <class K> Tag & operator () (const K & attr_name) { ::std::ostringstream oss; oss << " " << attr_name; args += oss.str(); return *this; } template <class K, class T> Tag & operator () (const K & attr_name, const T & value) { ::std::ostringstream oss; oss << " " << attr_name << "='" << value << "'"; args += oss.str(); return *this; } // DSL : template <class K> Tag operator () (const K & attr_name) const { Tag copy(*this); return copy (attr_name); } template <class K, class T> Tag operator () (const K & attr_name, const T & value) const { Tag copy(*this); return copy (attr_name, value); } // : template <class T> Tag(const T & name) : name(name) {} Tag(const Tag & ref) : name(ref.name), args(ref.args) {} ::std::string name; ::std::string args; };
... рдФрд░ рдЗрд╕ DSL рдкрд░ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рд░рд▓ XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ XSLT рдЙрджрд╛рд╣рд░рдг:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> <xsl:output method="text" version="1.0" encoding="windows-1251" indent="no"/> <xsl:template match="/"> <xsl:apply-templates/> ; </xsl:template> <xsl:template match="text()">"<xsl:value-of select="."/>"</xsl:template> <xsl:template match="attribute::*"> ("<xsl:value-of select="name()"/>", "<xsl:value-of select="."/>")</xsl:template> <xsl:template match="*"><xsl:if test="child::node()">xml::Element()</xsl:if> (<xsl:value-of select="name()"/><xsl:apply-templates select="attribute::*"/><xsl:if test="child::node()">, <xsl:apply-templates/></xsl:if>)</xsl:template> </xsl:stylesheet>
рдирддреАрдЬрддрди, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реА ++ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЦреВрди рд╕реЗ рдбреАрдПрд╕рдПрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ред рдЕрдм рдЕрдЧрд▓рд╛ рдЖрдЗрдЯрдо C ++ рдореЗрдВ SQL рдХреЛрдб рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ рд╣реЛрдЧрд╛ ...
рдмрд┐рддрд╛рдП рдЧрдП рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡рд┐рд╖рдп рдкрд╕рдВрдж рдЖрдпрд╛ред