Analysis and AST tree implementation of XPath Expression Language.

xiaoxiao2021-03-05  29

The expression language used by XPath, mainly consists of two parts: path search expressions for expression languages ​​and XPath. 1. Expression language, by , -, *, /, or, and, not, and values Strings, functions, etc. Comply with formal syntax. 2. XPath path search expressions refer to the expression of an XML Node in the XML document. For example, / books / book, search all Book bytes under the Books node. Specifically, you can refer to the description of XPath in www.w3c.org.

To achieve a complete XPath parser, the foundation is to implement its expression language parsing and XPath path search. Since only the XPath path search section is currently implemented, it simply introduces the implementation of path search.

The main components of XPath path expressions are 3: separator: "//", "/", '[', ']', ":" node name: such as / books / book path, Books And Book is a node name. Attribute name: such as / books / book [@ title = "123 *"], Title is a property name XPath path expression is also fully compliant, and there are three implementation methods for the lexical analysis and grammar analysis: state machine syntax analysis , Regular expression ratio, and lex / yacc. State machine syntax analysis is very convenient, the disadvantage is that the code implementation is not easy to expand; regular expression matches easy implementation, easy to expand, the disadvantage is performance integrity; Lex / YACC is easy to implement and expand, the disadvantage is that Unicode is not well supported, and XPath is an integral part of XML, support Unicode is the basic requirement. Since the XPath syntax has been relatively complete, the words of the individual selection state machine implement lexical and grammar analysis. The simple architecture is as follows: XPathToken, which is used to remove a token from the input XPath expression, which may be a separator, a node name, or a property name; XPathParser, read each token using XPathToken, then assembles these Token A meaningful XPath syntax, simultaneously checking; XpathDocument, based on the parsed XPath syntax, search from a corresponding node in an XML document; XPathDocument is the difficult point of XPath path search, because XpathDocument needs to go according to XPath expressions Traverse the XML node, so XML Parser is best to fully implement the functional part of the XML Dom Level2, for example, as follows: A simple XML document structure is as follows: Book1 </ title> <authoror > author1 </ author> </ book> <book> <title> book2 </ title> <author> author2 </ author> </ book> <books> then use the XPath expression: // Book / Title, target It is a search for all book's title. When the XPath parser parses the XPath expression and searches, the specific steps can be divided: 1. Create an XpathParser object to import XPath Expressions //Book/Title.2. Create an XMLDocument object, import XML document 3. Depending on XMLDocument, first XMLParser find "// Book", the meaning is to find all the names of the name "book". You can use XMLDocument's getElementByName to get all Book nodes; then XMLParser finds "/ title", which is to get all Title nodes under the current result set. It is necessary to traverse the current result set, query the Title node below.</p></div><div class="text-center mt-3 text-grey"> 转载请注明原文地址:https://www.9cbs.com/read-34082.html</div><div class="plugin d-flex justify-content-center mt-3"></div><hr><div class="row"><div class="col-lg-12 text-muted mt-2"><i class="icon-tags mr-2"></i><span class="badge border border-secondary mr-2"><h2 class="h6 mb-0 small"><a class="text-secondary" href="tag-2.html">9cbs</a></h2></span></div></div></div></div><div class="card card-postlist border-white shadow"><div class="card-body"><div class="card-title"><div class="d-flex justify-content-between"><div><b>New Post</b>(<span class="posts">0</span>) </div><div></div></div></div><ul class="postlist list-unstyled"> </ul></div></div><div class="d-none threadlist"><input type="checkbox" name="modtid" value="34082" checked /></div></div></div></div></div><footer class="text-muted small bg-dark py-4 mt-3" id="footer"><div class="container"><div class="row"><div class="col">CopyRight © 2020 All Rights Reserved </div><div class="col text-right">Processed: <b>0.035</b>, SQL: <b>9</b></div></div></div></footer><script src="./lang/en-us/lang.js?2.2.0"></script><script src="view/js/jquery.min.js?2.2.0"></script><script src="view/js/popper.min.js?2.2.0"></script><script src="view/js/bootstrap.min.js?2.2.0"></script><script src="view/js/xiuno.js?2.2.0"></script><script src="view/js/bootstrap-plugin.js?2.2.0"></script><script src="view/js/async.min.js?2.2.0"></script><script src="view/js/form.js?2.2.0"></script><script> var debug = DEBUG = 0; var url_rewrite_on = 1; var url_path = './'; var forumarr = {"1":"Tech"}; var fid = 1; var uid = 0; var gid = 0; xn.options.water_image_url = 'view/img/water-small.png'; </script><script src="view/js/wellcms.js?2.2.0"></script><a class="scroll-to-top rounded" href="javascript:void(0);"><i class="icon-angle-up"></i></a><a class="scroll-to-bottom rounded" href="javascript:void(0);" style="display: inline;"><i class="icon-angle-down"></i></a></body></html><script> var forum_url = 'list-1.html'; var safe_token = 'jeuTUDqRNCuCCeGNsZlQ_2FpYwewXW7douSMCAjQo2jC7M60IZwEcCANQr_2FtJiXhtdfucKux52t5eczOHsK9zreA_3D_3D'; var body = $('body'); body.on('submit', '#form', function() { var jthis = $(this); var jsubmit = jthis.find('#submit'); jthis.reset(); jsubmit.button('loading'); var postdata = jthis.serializeObject(); $.xpost(jthis.attr('action'), postdata, function(code, message) { if(code == 0) { location.reload(); } else { $.alert(message); jsubmit.button('reset'); } }); return false; }); function resize_image() { var jmessagelist = $('div.message'); var first_width = jmessagelist.width(); jmessagelist.each(function() { var jdiv = $(this); var maxwidth = jdiv.attr('isfirst') ? first_width : jdiv.width(); var jmessage_width = Math.min(jdiv.width(), maxwidth); jdiv.find('img, embed, iframe, video').each(function() { var jimg = $(this); var img_width = this.org_width; var img_height = this.org_height; if(!img_width) { var img_width = jimg.attr('width'); var img_height = jimg.attr('height'); this.org_width = img_width; this.org_height = img_height; } if(img_width > jmessage_width) { if(this.tagName == 'IMG') { jimg.width(jmessage_width); jimg.css('height', 'auto'); jimg.css('cursor', 'pointer'); jimg.on('click', function() { }); } else { jimg.width(jmessage_width); var height = (img_height / img_width) * jimg.width(); jimg.height(height); } } }); }); } function resize_table() { $('div.message').each(function() { var jdiv = $(this); jdiv.find('table').addClass('table').wrap('<div class="table-responsive"></div>'); }); } $(function() { resize_image(); resize_table(); $(window).on('resize', resize_image); }); var jmessage = $('#message'); jmessage.on('focus', function() {if(jmessage.t) { clearTimeout(jmessage.t); jmessage.t = null; } jmessage.css('height', '6rem'); }); jmessage.on('blur', function() {jmessage.t = setTimeout(function() { jmessage.css('height', '2.5rem');}, 1000); }); $('#nav li[data-active="fid-1"]').addClass('active'); </script>