• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "native_module_xml.h"
17 #include "js_xml.h"
18 
19 extern const char _binary_js_xml_js_start[];
20 extern const char _binary_js_xml_js_end[];
21 extern const char _binary_xml_abc_start[];
22 extern const char _binary_xml_abc_end[];
23 
24 namespace OHOS::xml {
XmlSerializerConstructor(napi_env env,napi_callback_info info)25     static napi_value XmlSerializerConstructor(napi_env env, napi_callback_info info)
26     {
27         napi_value thisVar = nullptr;
28         void *data = nullptr;
29         size_t argc = 0;
30         napi_value args[2] = { 0 }; // 2:The number of parameters is 2
31         XmlSerializer *object = nullptr;
32         size_t iLength = 0;
33         size_t offPos = 0;
34         napi_value arraybuffer = nullptr;
35         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, &data));
36         NAPI_ASSERT(env, argc == 1 || argc == 2, "Wrong number of arguments"); // 2: number of args
37         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, &data));
38         if (args[0] == nullptr) {
39             NAPI_CALL(env, napi_throw_error(env, "", "parameter is empty"));
40             return nullptr;
41         } else {
42             bool bFlag = false;
43             napi_is_arraybuffer(env, args[0], &bFlag);
44             if (bFlag) {
45                 napi_get_arraybuffer_info(env, args[0], &data, &iLength);
46             }
47             napi_is_dataview(env, args[0], &bFlag);
48             if (bFlag) {
49                 napi_get_dataview_info(env, args[0], &iLength, &data, &arraybuffer, &offPos);
50             }
51         }
52         if (argc == 1) {
53             object = new XmlSerializer(reinterpret_cast<char*>(data), iLength);
54         } else if (argc == 2) { // 2:When the input parameter is set to 2
55             std::string encoding = "";
56             napi_valuetype valuetype;
57             NAPI_CALL(env, napi_typeof(env, args[1], &valuetype));
58             NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected.");
59             napi_status status = napi_ok;
60             status = XmlSerializer::DealNapiStrValue(env, args[1], encoding);
61             if (status == napi_ok) {
62                 object = new XmlSerializer(reinterpret_cast<char*>(data), iLength, encoding);
63             }
64         }
65         napi_wrap(
66             env, thisVar, object,
67             [](napi_env environment, void *data, void *hint) {
68                 auto obj = reinterpret_cast<XmlSerializer*>(data);
69                 if (obj != nullptr) {
70                     delete obj;
71                 }
72             },
73             nullptr, nullptr);
74         return thisVar;
75     }
76 
XmlPullParserConstructor(napi_env env,napi_callback_info info)77     static napi_value XmlPullParserConstructor(napi_env env, napi_callback_info info)
78     {
79         napi_value thisVar = nullptr;
80         void *data = nullptr;
81         size_t argc = 0;
82         napi_value args[2] = { 0 }; // 2:two args
83         XmlPullParser *object = nullptr;
84         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, &data));
85         NAPI_ASSERT(env, argc == 1 || argc == 2, "Wrong number of arguments"); // 2:two args
86         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, &data));
87         napi_valuetype valuetype = napi_null;
88         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
89         NAPI_ASSERT(env, valuetype == napi_object, "Wrong argument typr. Object(DataView or ArrayBuffer) expected.");
90         bool bFlag = false;
91         size_t len = 0;
92         size_t offPos = 0;
93         napi_value arraybuffer = nullptr;
94         NAPI_ASSERT(env, args[0] != nullptr, "Wrong argument value. (not nullptr expected).");
95         napi_is_arraybuffer(env, args[0], &bFlag);
96         if (bFlag) {
97             napi_get_arraybuffer_info(env, args[0], &data, &len);
98         }
99         napi_is_dataview(env, args[0], &bFlag);
100         if (bFlag) {
101             napi_get_dataview_info(env, args[0], &len, &data, &arraybuffer, &offPos);
102         }
103         if (data) {
104             std::string strEnd(reinterpret_cast<char*>(data), len);
105             strEnd = strEnd.substr(0, std::strlen(strEnd.c_str()));
106             std::string cleanStr;
107             for (char c : strEnd) {
108                 if (c != '\r' && c != '\n') {
109                     cleanStr += c;
110                 }
111             }
112             if (argc == 1) {
113                 object = new XmlPullParser(cleanStr, "utf-8");
114             } else if (argc == 2) { // 2:When the input parameter is set to 2
115                 NAPI_CALL(env, napi_typeof(env, args[1], &valuetype));
116                 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected.");
117                 std::string strEncoding = "";
118                 XmlSerializer::DealNapiStrValue(env, args[1], strEncoding);
119                 object = new XmlPullParser(cleanStr, strEncoding);
120             }
121         }
122         napi_wrap(
123             env, thisVar, object,
124             [](napi_env env, void *data, void *hint) {
125                 auto obj = reinterpret_cast<XmlPullParser*>(data);
126                 if (obj != nullptr) {
127                     delete obj;
128                 }
129             },
130             nullptr, nullptr);
131         return thisVar;
132     }
133 
SetAttributes(napi_env env,napi_callback_info info)134     static napi_value SetAttributes(napi_env env, napi_callback_info info)
135     {
136         napi_value thisVar = nullptr;
137         size_t argc = 0;
138         napi_value args[2] = { 0 }; // 2:two args
139         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
140         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
141         NAPI_ASSERT(env, argc == 2, "Wrong number of arguments"); // 2: number of args
142         napi_valuetype valuetype = napi_null;
143         NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty.");
144         NAPI_ASSERT(env, args[1] != nullptr, "Parameter is empty.");
145         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
146         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. Object expected.");
147         NAPI_CALL(env, napi_typeof(env, args[1], &valuetype));
148         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. Object expected.");
149         XmlSerializer *object = nullptr;
150         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
151         std::string name;
152         std::string value;
153         XmlSerializer::DealNapiStrValue(env, args[0], name);
154         XmlSerializer::DealNapiStrValue(env, args[1], value);
155         object->SetAttributes(name, value);
156         napi_value result = nullptr;
157         NAPI_CALL(env, napi_get_undefined(env, &result));
158         return result;
159     }
160 
AddEmptyElement(napi_env env,napi_callback_info info)161     static napi_value AddEmptyElement(napi_env env, napi_callback_info info)
162     {
163         napi_value thisVar = nullptr;
164         size_t argc = 1;
165         napi_value args[1] = { 0 };
166         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
167         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments(Over)");
168         if (args[0] == nullptr) {
169             NAPI_CALL(env, napi_throw_error(env, "", "parameter is empty"));
170             return nullptr;
171         } else {
172             napi_valuetype valuetype;
173             NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
174             NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected.");
175             XmlSerializer *object = nullptr;
176             NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
177             std::string name;
178             object->DealNapiStrValue(env, args[0], name);
179             object->AddEmptyElement(name);
180         }
181         napi_value result = nullptr;
182         NAPI_CALL(env, napi_get_undefined(env, &result));
183         return result;
184     }
185 
SetDeclaration(napi_env env,napi_callback_info info)186     static napi_value SetDeclaration(napi_env env, napi_callback_info info)
187     {
188         napi_value thisVar = nullptr;
189         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
190         XmlSerializer *object = nullptr;
191         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
192         object->SetDeclaration();
193         napi_value result = nullptr;
194         NAPI_CALL(env, napi_get_undefined(env, &result));
195         return result;
196     }
197 
StartElement(napi_env env,napi_callback_info info)198     static napi_value StartElement(napi_env env, napi_callback_info info)
199     {
200         size_t argc = 1;
201         napi_value args[1] = { 0 };
202         napi_value thisVar = nullptr;
203         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
204         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
205         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
206         NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty.");
207         XmlSerializer *object = nullptr;
208         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
209         std::string name;
210         object->DealNapiStrValue(env, args[0], name);
211         object->StartElement(name);
212         napi_value result = nullptr;
213         NAPI_CALL(env, napi_get_undefined(env, &result));
214         return result;
215     }
216 
EndElement(napi_env env,napi_callback_info info)217     static napi_value EndElement(napi_env env, napi_callback_info info)
218     {
219         napi_value thisVar = nullptr;
220         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
221         XmlSerializer *object = nullptr;
222         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
223         object->EndElement();
224         napi_value result = nullptr;
225         NAPI_CALL(env, napi_get_undefined(env, &result));
226         return result;
227     }
228 
SetNamespace(napi_env env,napi_callback_info info)229     static napi_value SetNamespace(napi_env env, napi_callback_info info)
230     {
231         napi_value thisVar = nullptr;
232         size_t argc = 0;
233         napi_value args[2] = { 0 }; // 2:two args
234         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
235         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
236         NAPI_ASSERT(env, argc == 2, "Wrong number of arguments"); // 2:two args
237         napi_valuetype valuetype = napi_null;
238         NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty.");
239         NAPI_ASSERT(env, args[1] != nullptr, "Parameter is empty.");
240         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
241         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. Object expected.");
242         NAPI_CALL(env, napi_typeof(env, args[1], &valuetype));
243         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. Object expected.");
244         XmlSerializer *object = nullptr;
245         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
246         std::string prefix;
247         std::string nsTemp;
248         XmlSerializer::DealNapiStrValue(env, args[0], prefix);
249         XmlSerializer::DealNapiStrValue(env, args[1], nsTemp);
250         object->SetNamespace(prefix, nsTemp);
251         napi_value result = nullptr;
252         NAPI_CALL(env, napi_get_undefined(env, &result));
253         return result;
254     }
255 
SetComment(napi_env env,napi_callback_info info)256     static napi_value SetComment(napi_env env, napi_callback_info info)
257     {
258         napi_value thisVar = nullptr;
259         size_t argc = 0;
260         napi_value args[1] = { 0 };
261         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
262         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
263         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
264         napi_valuetype valuetype = napi_null;
265         NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty).");
266         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
267         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected");
268         XmlSerializer *object = nullptr;
269         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
270         std::string comment;
271         object->DealNapiStrValue(env, args[0], comment);
272         object->SetComment(comment);
273         napi_value result = nullptr;
274         NAPI_CALL(env, napi_get_undefined(env, &result));
275         return result;
276     }
277 
SetCData(napi_env env,napi_callback_info info)278     static napi_value SetCData(napi_env env, napi_callback_info info)
279     {
280         napi_value thisVar = nullptr;
281         size_t argc = 0;
282         napi_value args[1] = { 0 };
283         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
284         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
285         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
286         napi_valuetype valuetype = napi_null;
287         NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty).");
288         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
289         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected");
290         XmlSerializer *object = nullptr;
291         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
292         std::string data;
293         XmlSerializer::DealNapiStrValue(env, args[0], data);
294         object->SetCData(data);
295         napi_value result = nullptr;
296         NAPI_CALL(env, napi_get_undefined(env, &result));
297         return result;
298     }
299 
SetText(napi_env env,napi_callback_info info)300     static napi_value SetText(napi_env env, napi_callback_info info)
301     {
302         napi_value thisVar = nullptr;
303         size_t argc = 0;
304         napi_value args[1] = { 0 };
305         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
306         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
307         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
308         napi_valuetype valuetype = napi_null;
309         NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty).");
310         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
311         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected.");
312         XmlSerializer *object = nullptr;
313         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
314         std::string text;
315         XmlSerializer::DealNapiStrValue(env, args[0], text);
316         object->SetText(text);
317         napi_value result = nullptr;
318         NAPI_CALL(env, napi_get_undefined(env, &result));
319         return result;
320     }
321 
SetDocType(napi_env env,napi_callback_info info)322     static napi_value SetDocType(napi_env env, napi_callback_info info)
323     {
324         napi_value thisVar = nullptr;
325         size_t argc = 0;
326         napi_value args[1] = { 0 };
327         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
328         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
329         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
330         napi_valuetype valuetype = napi_null;
331         NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty).");
332         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
333         NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument typr. String expected.");
334         XmlSerializer *object = nullptr;
335         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
336         std::string text;
337         XmlSerializer::DealNapiStrValue(env, args[0], text);
338         object->SetDocType(text);
339         napi_value result = nullptr;
340         NAPI_CALL(env, napi_get_undefined(env, &result));
341         return result;
342     }
XmlSerializerError(napi_env env,napi_callback_info info)343     static napi_value XmlSerializerError(napi_env env, napi_callback_info info)
344     {
345         napi_value thisVar = nullptr;
346         napi_value result = nullptr;
347         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
348         XmlSerializer *object = nullptr;
349         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
350         std::string temp = object->XmlSerializerError();
351         size_t templen = temp.size();
352         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
353         return result;
354     }
355 
XmlSerializerInit(napi_env env,napi_value exports)356     napi_value XmlSerializerInit(napi_env env, napi_value exports)
357     {
358         const char *xmlSerializerClass = "XmlSerializer";
359         napi_value xmlClass = nullptr;
360         napi_property_descriptor xmlDesc[] = {
361             DECLARE_NAPI_FUNCTION("setAttributes", SetAttributes),
362             DECLARE_NAPI_FUNCTION("addEmptyElement", AddEmptyElement),
363             DECLARE_NAPI_FUNCTION("setDeclaration", SetDeclaration),
364             DECLARE_NAPI_FUNCTION("startElement", StartElement),
365             DECLARE_NAPI_FUNCTION("endElement", EndElement),
366             DECLARE_NAPI_FUNCTION("setNamespace", SetNamespace),
367             DECLARE_NAPI_FUNCTION("setComment", SetComment),
368             DECLARE_NAPI_FUNCTION("setCDATA", SetCData),
369             DECLARE_NAPI_FUNCTION("setText", SetText),
370             DECLARE_NAPI_FUNCTION("setDocType", SetDocType),
371             DECLARE_NAPI_FUNCTION("XmlSerializerError", XmlSerializerError)
372         };
373         NAPI_CALL(env, napi_define_class(env, xmlSerializerClass, strlen(xmlSerializerClass), XmlSerializerConstructor,
374                                          nullptr, sizeof(xmlDesc) / sizeof(xmlDesc[0]), xmlDesc, &xmlClass));
375         napi_property_descriptor desc[] = {
376             DECLARE_NAPI_PROPERTY("XmlSerializer", xmlClass)
377         };
378         napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
379         return exports;
380     }
381 
Parse(napi_env env,napi_callback_info info)382     static napi_value Parse(napi_env env, napi_callback_info info)
383     {
384         napi_value thisVar = nullptr;
385         size_t argc = 0;
386         napi_value args[1] = { 0 };
387         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
388         NAPI_ASSERT(env, argc == 1, "Wrong number of arguments, one expected.");
389         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
390         NAPI_ASSERT(env, args[0] != nullptr, "Parameter is empty.");
391         napi_valuetype valuetype;
392         NAPI_CALL(env, napi_typeof(env, args[0], &valuetype));
393         NAPI_ASSERT(env, valuetype == napi_object, "Wrong argument typr. Object expected.");
394         XmlPullParser *object = nullptr;
395         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
396         object->DealOptionInfo(env, args[0]);
397         object->Parse(env, thisVar);
398         napi_value result = nullptr;
399         NAPI_CALL(env, napi_get_undefined(env, &result));
400         return result;
401     }
402 
XmlPullParserError(napi_env env,napi_callback_info info)403     static napi_value XmlPullParserError(napi_env env, napi_callback_info info)
404     {
405         napi_value thisVar = nullptr;
406         napi_value result = nullptr;
407         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
408         XmlPullParser *object = nullptr;
409         NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&object)));
410         std::string temp = object->XmlPullParserError();
411         size_t templen = temp.size();
412         NAPI_CALL(env, napi_create_string_utf8(env, temp.c_str(), templen, &result));
413         return result;
414     }
415 
XmlPullParserInit(napi_env env,napi_value exports)416     napi_value XmlPullParserInit(napi_env env, napi_value exports)
417     {
418         const char *xmlPullParserClass = "XmlPullParser";
419         napi_value xmlClass = nullptr;
420         napi_property_descriptor xmlDesc[] = {
421             DECLARE_NAPI_FUNCTION("parse", Parse),
422             DECLARE_NAPI_FUNCTION("XmlPullParserError", XmlPullParserError)
423         };
424         NAPI_CALL(env, napi_define_class(env, xmlPullParserClass, strlen(xmlPullParserClass),
425             XmlPullParserConstructor, nullptr, sizeof(xmlDesc) / sizeof(xmlDesc[0]),
426             xmlDesc, &xmlClass));
427         napi_property_descriptor desc[] = {
428             DECLARE_NAPI_PROPERTY("XmlPullParser", xmlClass)
429         };
430         napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
431         return exports;
432     };
433 
Init(napi_env env,napi_value exports)434     static napi_value Init(napi_env env, napi_value exports)
435     {
436         XmlSerializerInit(env, exports);
437         XmlPullParserInit(env, exports);
438         return exports;
439     }
440 
441     extern "C"
NAPI_xml_GetJSCode(const char ** buf,int * bufLen)442     __attribute__((visibility("default"))) void NAPI_xml_GetJSCode(const char **buf, int *bufLen)
443     {
444         if (buf != nullptr) {
445             *buf = _binary_js_xml_js_start;
446         }
447 
448         if (bufLen != nullptr) {
449             *bufLen = _binary_js_xml_js_end - _binary_js_xml_js_start;
450         }
451     }
452     extern "C"
NAPI_xml_GetABCCode(const char ** buf,int * buflen)453     __attribute__((visibility("default"))) void NAPI_xml_GetABCCode(const char** buf, int* buflen)
454     {
455         if (buf != nullptr) {
456             *buf = _binary_xml_abc_start;
457         }
458         if (buflen != nullptr) {
459             *buflen = _binary_xml_abc_end - _binary_xml_abc_start;
460         }
461     }
462 
463 
464     static napi_module_with_js xmlModule = {
465         .nm_version = 1,
466         .nm_flags = 0,
467         .nm_filename = nullptr,
468         .nm_register_func = Init,
469         .nm_modname = "xml",
470         .nm_priv = reinterpret_cast<void*>(0),
471         .nm_get_abc_code = NAPI_xml_GetABCCode,
472         .nm_get_js_code = NAPI_xml_GetJSCode,
473     };
XmlRegisterModule()474     extern "C" __attribute__((constructor)) void XmlRegisterModule()
475     {
476         napi_module_with_js_register(&xmlModule);
477     }
478 } // namespace OHOS::Xml
479