//msxml 文档对象 import com; import web; import util.metaProperty; import web.form; namespace web; class msxml{ ctor( xml,... ){ this.document = ..com.CreateObject("MSXML2.DOMDocument"); this.document.setProperty("SelectionLanguage", "XPath"); this.document.async = false; if( xml ){ if( ..string.find(xml,"^\s*\<") ){ if( ... !== null ) xml = ..string.fromto(xml,(...) ) this.document.loadXML( xml ) } else { this.url = ..web.form.mapurl(xml); this.document.load( this.url ); } } }; @_metaProperty; } namespace msxml{ _metaProperty = ..util.metaProperty( eachNode = function( tagName="*",xnode ){ if(!xnode) xnode = owner.document.documentElement; if( xnode ? xnode.getElementsByTagName ) return ..com.each( xnode.getElementsByTagName(tagName) ); return function(){} } queryNodes = function(tOptions){ var tab = {} var cmp = ..string.cmpMatch var parent = tOptions.parent; tOptions.parent = null;//don't query; for i,xnode in owner.eachNode( ,parent ) { EACH: if(!xnode.getAttribute) continue; for(k,v in tOptions){ var attr = xnode.getAttribute(k) : xnode[k]; if( ..com.IsObject(attr) ){ if( type(v) == type.table ){ for(attr_k,attr_v in v){ if( ! cmp( attr[attr_k],attr_v )){ continue EACH; } } } } elseif( ! cmp( attr,v ) ){ continue EACH; } } ..table.push(tab,xnode); } return ..web.form.query( tab ); } load = function(url,...){ owner[["(url)"]] = ..web.form.mapurl(url); owner[["(filepath)"]] = owner[["(url)"]]; return owner.document.load(owner[["(url)"]],...); } transformNode = function(url){ var xsl = ..com.CreateObject("MSXML2.DOMDocument"); xsl.async = false; xsl.load(..web.form.mapurl(url)); if (xsl.parseError.errorCode != 0) { var e = xsl.parseError.reason; ..com.Release(xsl); error(e,2); } else { var r = owner.document.transformNode(xsl); ..com.Release(xsl); return r; } } save = function(path,...){ if( path ){ owner[["(url)"]] = ..io.fullpath(path); owner[["(filepath)"]] = owner[["(url)"]]; } return owner.document.save(owner[["(url)"]],...); } loadXml = function(xml,cp){ if(cp!==null) xml = ..string.fromto(xml,cp); owner.document.loadXML(xml) } filepath = { _get = function(){ return owner[["(filepath)"]] } } xml = { _get = function(){ return owner.document.getxml() } } documentElement = { _get = function(){ return owner.document.documentElement } } get = function(k){ if(!type.isString(k)) return; var r = owner.document[k] ; if( r === null ) r = owner.document.getElementsByTagName(k); return r; } set = function(k,v){ if(!type.isString(k) || (k[1]=='_'#) ) { owner[[k]] = v; } else{ owner.document[k] = v; } } ); } /**intellisense() web.msxml = MSXML 支持库 web.msxml() = 创建 XML 文档对象,可选在参数中指定 URL 或 XML 文本,\n如果是 XML 文本,可选使用参数@2指定内码\n!msxml. !msxml.eachNode("tagName", ) = @//创建迭代器,遍历指定XML标记,例:\nfor i,xnode in ??.eachNode("tagName",__/*可选指定父节点*/) {\n \n}\n !msxml.eachNode() = @//创建迭代器,遍历指定XML标记,例:\nfor i,xnode in ??.eachNode(__/*可选指定tagName*/) {\n \n}\n!msXmlNode. !msxml.queryNodes = @//可指定任意个属性条件值.支持模式匹配语法\n??.queryNodes( parent = 可选指定父节点;tagName = "标记") !msxml.queryNodes() = !msXmlNode. !msxml.load(.(URL) = 载入XML文档,参数可以是网址或本地路径 !msxml.save("__->xml") = 保存XML文档 !msxml.loadXml(__) = 从字符串载入 XML 文档,参数 @2 可选使用一个数值指定代码页( codepage )。 !msxml.transformNode(.(XSL网址) = 应用XSL样式 !msxml.url = XML 文件 URL,只读属性。 !msxml.filepath = XML 文件 路径,只读属性。 !msxml.documentElement = !msXmlNode. !msxml.document = XML 文档对象(MSXML2.DOMDocument 对象),这是一个 COM 对象。\n!msXmlDoc. !msxml.getElementsByTagName("*__/*tagName*/") = 根据标签名返回节点 !msxml.getElementsByTagName() = !msXmlNode. !msxml.nodeFromId("__/*ID*/") = 根据ID返回节点 !msxml.nodeFromId() = !msXmlNode. !msxml.setProperty("SelectionLanguage","XPath") = 设置属性 !msxml.selectNodes("__/*XPath表达式*/") = 查询节点。\n返回 COM 数组,使用 length 属性获取数组长度。\n返回数组起始索引为 0(aardio 普通数组起始索引为 1) !msxml.createNode(.(类型,名称,命名空间) = 创建节点 !msxml.createNode() = !msXmlNode. !msxml.xml = 返回XML文本 !msXmlDoc.parseError = 返回错误信息 !msXmlDoc.parseError.errorCode = 该错误代码 !msXmlDoc.parseError.reason = 错误信息 !msXmlDoc.parseError.line = 错误行号 !msXmlDoc.parseError.linePos = 错误列号 !msXmlDoc.parseError.srcText = 出错XML代码 !msXmlDoc.validateOnParse = 解析XML是否验证合法性 !msXmlDoc.readyState = 0-未初始化、1-正在加载、2-已加载、3-交互中、4-已完成 !msXmlDoc.getElementsByTagName("*__/*tagName*/") = 根据标签名返回节点 !msXmlDoc.getElementsByTagName() = !msXmlNode. !msXmlDoc.nodeFromId("__/*ID*/") = 根据ID返回节点 !msXmlDoc.nodeFromId() = !msXmlNode. !msXmlDoc.setProperty("SelectionLanguage","XPath") = 设置属性 !msXmlDoc.selectNodes("__/*XPath表达式*/") = 查询节点。\n返回 COM 数组,使用 length 属性获取数组长度。\n返回数组起始索引为 0(aardio 普通数组起始索引为 1) !msXmlDoc.createNode(.(类型,名称,命名空间) = 创建节点 !msXmlDoc.createNode() = !msXmlNode. !msXmlDoc.documentElement = !msXmlNode. !msXmlAttributeNode.nodeName = 获取特定结点类型的名称 !msXmlAttributeNode.nodeType = 获取所需结点的类型 !msXmlAttributeNode.nodeValue = 设置或获取结点的值 !msXmlAttributeNode.specified = 获取是否指定了该属性 !msXmlAttributeNode.value = 设置或获取对象的值 end intellisense**/ /**intellisense(!msXmlNode) attributes().nodeValue = 属性值 text = 文本 xml = XML 源码 nodeName = 获取特定节点类型的名称 nodeType = 获取所需节点的类型 nodeValue = 设置或获取节点的文本值 getText() = 返回文本属性 setText(__) = 修改文本属性 nodeType = 节点类型 childNodes = 子节点集合 childNodes() = !msXmlNode. childNodes.item() = !msXmlNode. attributes(0__) = 对象标签属性的集合指定位置的对象 parentNode = 获取文档层次中的父对象 firstChild = 返回第一个节点\n!msXmlNode. lastChild = 返回最后一个节点\n!msXmlNode. nextNode = 下一个节点\n!msXmlNode. length = 集合中的节点个数 tagName = 获取对象的标签名称 hasChildNodes() = 对象是否有子对象的值 appendChild(.(子节点) = 添加子节点 insertBefore(.(插入新节点,子节点) = 插入子节点 removeChild(.(节点名) = 移除节点 replaceChild(.(新节点,旧节点) = 替换节点 cloneNode() = 克隆节点\n!msXmlNode. cloneNode(true) = 完全克隆节点\n!msXmlNode. readyState = 获取对象的当前状态。 \n'uninitialized','loading','interactive','loaded' 'complete' setAttribute("属性名__","属性值") = 修改属性\n也可以直接写 ele.属性名字 = 值 getAttribute("属性名__/*属性名*/") = 获取属性\n也可以直接写 var 返回值=ele.属性名字 getAttributeNode("__/*属性名*/") = 获取attribute对象 selectNodes("__/*XPATH表达式*/") = 查询节点 selectSingleNode("__/*XPATH表达式*/") = 查询节点 selectNodes() = !msXmlNode. selectSingleNode() = !msXmlNode. getElementsByTagName("__/*tagName*/") = 根据标签名返回节点 getElementsByTagName() = !msXmlNode. getAttributeNode() = !msXmlAttributeNode. attributes() = !msXmlAttributeNode. end intellisense**/