Annotation of parser3/src/classes/xnode.C, revision 1.2
1.1 parser 1: /** @file
2: Parser: @b dom parser class.
3:
4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
5: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
6:
1.2 ! parser 7: $Id: xnode.C,v 1.1 2001/09/26 11:24:07 parser Exp $
1.1 parser 8: */
9: #include "classes.h"
10: #ifdef XML
11:
12: #include "pa_request.h"
13: #include "pa_vxnode.h"
14:
15: #include "xnode.h"
16:
17: #include <util/XMLString.hpp>
18: #include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
19: #include <XPath/XPathEvaluator.hpp>
20: #include <XPath/NodeRefList.hpp>
21:
22: // defines
23:
24: #define XNODE_CLASS_NAME "xnode"
25:
26: // class
27:
28: // methods
29:
30: static void _select(Request& r, const String& method_name, MethodParams *params) {
31: // _asm int 3;
32: Pool& pool=r.pool();
33: VXnode& vnode=*static_cast<VXnode *>(r.self);
34:
35: // expression
36: const String& expression=params->as_string(0, "expression must not be code");
37: const char *expression_cstr=expression.cstr(String::UL_AS_IS);
38: XalanDOMString dstring(expression_cstr);
39: const XalanDOMChar *expression_dcstr=dstring.c_str();
40:
41: XPathEvaluator evaluator;
42: // We'll use these to parse the XML file.
43: XalanSourceTreeDOMSupport dom_support;
44:
45: try {
46: NodeRefList list=evaluator.selectNodeList(dom_support,
47: &vnode.get_node(pool, &method_name),
48: expression_dcstr);
49:
50: VHash& result=*new(pool) VHash(pool);
51: for(int i=0; i<list.getLength(); i++) {
52: String& skey=*new(pool) String(pool);
53: {
54: char *buf=(char *)pool.malloc(MAX_NUMBER);
55: snprintf(buf, MAX_NUMBER, "%d", i);
56: skey << buf;
57: }
58:
59: result.hash().put(skey, new(pool) VXnode(pool, list.item(i)));
60: }
61: result.set_name(method_name);
62: r.write_no_lang(result);
63: } catch(const XSLException& e) {
64: r._throw(&expression, e);
65: }
66: }
67:
68: static void _select_single(Request& r, const String& method_name, MethodParams *params) {
69: // _asm int 3;
70: Pool& pool=r.pool();
71: VXnode& vnode=*static_cast<VXnode *>(r.self);
72:
73: // expression
74: const String& expression=params->as_string(0, "expression must not be code");
75: const char *expression_cstr=expression.cstr(String::UL_AS_IS);
76: XalanDOMString dstring(expression_cstr);
77: const XalanDOMChar *expression_dcstr=dstring.c_str();
78:
79: XPathEvaluator evaluator;
80: // Initialize the XalanSourceTree subsystem...
81: // XalanSourceTreeInit theSourceTreeInit;
82: // We'll use these to parse the XML file.
83: XalanSourceTreeDOMSupport dom_support;
84:
85: try {
86: if(XalanNode *node=evaluator.selectSingleNode(dom_support,
87: &vnode.get_node(pool, &method_name),
88: expression_dcstr)) {
89:
90: VXnode& result=*new(pool) VXnode(pool, node);
91: result.set_name(method_name);
92: r.write_no_lang(result);
93: }
94: } catch(const XSLException& e) {
95: r._throw(&expression, e);
96: }
97: }
98:
99: // constructor
100:
1.2 ! parser 101: MXnode::MXnode(Pool& apool) : Methoded(apool),
! 102: consts(apool) {
1.1 parser 103: set_name(*NEW String(pool(), XNODE_CLASS_NAME));
104:
105: // ^node.select[/some/xpath/query] = hash $.#[dnode]
106: add_native_method("select", Method::CT_DYNAMIC, _select, 1, 1);
107:
108: // ^node.select-single[/some/xpath/query] = first dnode
109: add_native_method("select-single", Method::CT_DYNAMIC, _select_single, 1, 1);
1.2 ! parser 110:
! 111: // consts
! 112:
! 113: #define CONST(name, value) \
! 114: consts.put(*new(pool()) String(pool(), #name), new(pool()) VInt(pool(), value))
! 115:
! 116: CONST(ELEMENT_NODE, 1);
! 117: CONST(ATTRIBUTE_NODE, 2);
! 118: CONST(TEXT_NODE, 3);
! 119: CONST(CDATA_SECTION_NODE, 4);
! 120: CONST(ENTITY_REFERENCE_NODE, 5);
! 121: CONST(ENTITY_NODE, 6);
! 122: CONST(PROCESSING_INSTRUCTION_NODE, 7);
! 123: CONST(COMMENT_NODE, 8);
! 124: CONST(DOCUMENT_NODE, 9);
! 125: CONST(DOCUMENT_TYPE_NODE, 10);
! 126: CONST(DOCUMENT_FRAGMENT_NODE, 11);
! 127: CONST(NOTATION_NODE, 12);
1.1 parser 128:
129: }
130: // global variable
131:
132: Methoded *Xnode_class;
133:
134: #endif
135:
136: // creator
137: Methoded *MXnode_create(Pool& pool) {
138: return
139: #ifdef XML
140: Xnode_class=new(pool) MXnode(pool)
141: #else
142: 0
143: #endif
144: ;
145: }
E-mail: