VBA读取XML节点

VBA读取XML节点,第1张

控制台应用程序中测试 static void Main(string[] args) { XmlDocument xd = new XmlDocument(); xdLoad("XMLFile1xml"); ConsoleWriteLine("根据节点的Name查找,请输入Name:"); string name = ConsoleReadLine()

typedef struct node{

int val; //值

int nc; //子节点个数

struct node child[16]; //存储子节点指针,假设最大不超过16个

} node;

node search(node root,int var) //指定搜索起始根节点和欲搜索的值,返回找到节点的指针

{

int i;

node t;

if(!root) //若根节点为空,没什么好说的,返回空

return null;

if(root->val==var) //如果根节点满足要求,直接返回

return root;

for(i=0;i<nc;++i) //否则递归地对其每一颗子树进行搜索

{

t=search(root->child[i],var);

if(t) //在第i棵子树下搜到了,返回找到的节点,否则继续for循环,搜下一棵子树

return t;

}

return null; //所有子树都搜不到,返回空

}

这其实是一个深度优先搜索的过程,用递归实现,代码简洁有效

其实原理和二叉树是一样的,二叉树其实就是nc最大为2的情况,二叉树的先左后右其实就是i的从0到1

对于ext来说最好的方式是不要一下将所有的节点全部展开,因为这样的话当数据量大的时候,后台读取所有节点的数据,并且拼装tree节点的速度比较慢,而且渲染也比较慢,经常在默认时间内无法渲染出你从后台读取的数据,所以建议点击一个节点的时候在进行ajax的异步加载。

相关代码:

//点击节点触发

treeon("click", function(node, event) {

// 判断当前节点是否为第一级子节点

if (nodeid != 0) {

if(nodeparentNodeid==0){

formPanelfindById('checkBtn')enable();

}else{

formPanelfindById('checkBtn')disable();

}

var fatherText = nodeparentNodetext;

if(fatherText!=null){

formPanelfindById('supercatName')setValue(fatherText);

}else{

formPanelfindById('supercatName')setValue('公开分类');

}

formPanelfindById('catIsroot')setValue(nodeid);

setdate(formPanel, nodeid,node)

} else {

formPanelfindById('checkBtn')enable();

formPanelfindById('catIsroot')setValue('1');

ExtgetCmp('catName')setValue('');

ExtgetCmp('catUnitidname')setValue('');

ExtMsgalert('提示', '请选择具体类别');

}

});

//首节点

rootNode = new ExttreeAsyncTreeNode({

id : "0",

text : "公开类别"

});

tree = new ExttreeTreePanel({

root : rootNode,

frame : true,

animate : true, // 开启动画效果

enableDD : false, // 不允许子节点拖动

border : true, // 没有边框

singleClickExpand : true,

autoScroll : true,

tbar : tbar,

height : documentbodyclientHeight,

height : documentbodyclientHeight,

loader : new ExttreeTreeLoader({

dataUrl : REQUEST_URL,

baseParams : {

method : 'getOpenBasicTree'

}

})

});

// 默认展开第一层

rootNodeexpand(false, true);

然后将tree放到一个panel里面就行了

我给你个提取xml内容的示例,,至于怎么生成excel,那就得加工处理下。(比如说提取内容后,再插入到excel),有一点要注意的是,你必须知道xml的节点,不然没办法 *** 作

//strRead 是xml内容

XmlDocument xd = new XmlDocument();

xdLoadXml(strRead);

XmlNodeList nodeList = xdSelectSingleNode("root")ChildNodes;//获取root节点的所有子节点

foreach (XmlNode xn in nodeList)//遍历所有子节点

{

XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型

if (xeName == "result")

{

XmlNodeList nls = xeChildNodes;//继续获取xe子节点的所有子节点

if (nlsCount > 0)

{

XmlNode xnValue = nlsItem(0); //节点的项,这个再根据情况判断

if(xnValueValueToLower()=="all")

Dgrid1ReadOnly = false;

else

Dgrid1ReadOnly = true;

}

}

}

lxml是Python语言中处理XML和HTML功能最丰富,最易于使用的库。

lxml是libxml2和libxslt两个C库的Python化绑定,它的独特之处在于兼顾了这些库的速度和功能完整性,同时还具有Python API的简介。兼容ElementTree API,但是比它更优越。

用libxml2编程就像是一个异于常人的陌生人的令人惊恐的拥抱,它看上去可以满足你一切疯狂的梦想,但是你的内心深处一直在警告你,你有可能会以最糟糕的方式遭殃,所以就有了lxml。

这是一个用lxmletree来处理XML的教程,它简单的概述了ElementTree API的主要概念,同时有一些能让你的程序生涯更轻松的简单的提高。

首先是导入lxmletree的方式:

from lxml import etree

为了协助代码的可移植性,本教程中的例子很明显可以看出,一部分API是lxmletree在ElementTree API(由Fredrik Lundh 的ElementTree库定义)的基础上的扩展。

Element是ElementTree API的主要容器类,大部分XML tree的功能都是通过这个类来实现的,Element的创建很容易:

root = etreeElement("root")

element的XML tag名通过tag属性来访问

>>>print roottag

root

许多Element被组织成一个XML树状结构,创建一个子element并添加进父element使用append方法:

>>>rootappend(etreeElement("child1"))

还有一个更简短更有效的方法:the SubElement,它的参数和element一样,但是需要父element作为第一个参数:

>>>child2 = etreeSubElement(root,"child2")

>>>child3 = etreeSubElement(root,"child3")

可以序列化你创建的树:

>>>print(etreetostring(root, pretty_print=True))

<root>

  <child1/>

  <child2/>

  <child3/>

</root>

为了更方便直观的访问这些子节点,element模仿了正常的Python链:

>>> child = root[0]>>> print(childtag)

child1

>>> print(len(root))

>>> rootindex(root[1]) # lxmletree only!

>>> children = list(root)>>> for child in root:     print(childtag)child1child2

child3

>>> rootinsert(0, etreeElement("child0"))>>> start = root[:1]>>> end   = root[-1:]>>> print(start[0]tag)child0>>> print(end[0]tag)child3

还可以根据element的真值看其是否有孩子节点:

if root:   # this no longer works!

    print("The root element has children")

用len(element)更直观,且不容易出错:

>>> print(etreeiselement(root))  # test if it's some kind of Element

True

>>> if len(root):                 # test if it has children

     print("The root element has children")

The root element has children

还有一个重要的特性,原文的句子只可意会,看例子应该是能看懂什么意思吧。

>>> for child in root:     print(childtag)child0child1child2child3>>> root[0] = root[-1]  #移动了element>>> for child in root:     print(childtag)child3child1child2>>> l = [0, 1, 2, 3]>>> l[0] = l[-1]>>> l[3, 1, 2, 3]

>>> root is root[0]getparent()  # lxmletree only!TrueIf you want to copy an element to a different position in lxmletree, consider creating an independent deep copy using the copy module from Python's standard library:>>> from copy import deepcopy>>> element = etreeElement("neu")>>> elementappend( deepcopy(root[1]) )>>> print(element[0]tag)child1>>> print([ ctag for c in root ])['child3', 'child1', 'child2']

XML支持属性,创建方式如下:

>>> root = etreeElement("root", interesting="totally")

>>> etreetostring(root)

b'<root interesting="totally"/>'

属性是无序的键值对,所以可以用element类似于字典接口的方式处理:

>>> print(rootget("interesting"))

totally

>>> print(rootget("hello"))

None

>>> rootset("hello", "Huhu")

>>> print(rootget("hello"))

Huhu

>>> etreetostring(root)

b'<root interesting="totally" hello="Huhu"/>'

>>> sorted(rootkeys())

['hello', 'interesting']

>>> for name, value in sorted(rootitems()):

     print('%s = %r' % (name, value))

hello = 'Huhu'

interesting = 'totally'

如果需要获得一个类似dict的对象,可以使用attrib属性:

>>> attributes = rootattrib

>>> print(attributes["interesting"])

totally

>>> print(attributesget("no-such-attribute"))

None

>>> attributes["hello"] = "Guten Tag"

>>> print(attributes["hello"])

Guten Tag

>>> print(rootget("hello"))

Guten Tag

既然attrib是element本身支持的类似dict的对象,这就意味着任何对element的改变都会影响attrib,反之亦然。这还意味着只要element的任何一个attrib还在使用,XML树就一直在内存中。通过如下方法,可以获得一个独立于XML树的attrib的快照:

>>> d = dict(rootattrib)

>>> sorted(ditems())

[('hello', 'Guten Tag'), ('interesting', 'totally')]

创建解析器

SAXReader saxreader = new SAXReader();

读取文档

Document doc = saxreaderread(new File("url"));

获取根

Element root = docgetRootElement();

获取子节点

List<Element> list = rootelements();

Systemoutprintln(eelementText("name"));

Systemoutprintln(eelement("score")attributeValue("java"));

Reader reader = new InputStreamReader(con

getInputStream());

SAXReader sax = new SAXReader();

// saxsetEncoding("GBK");

Document document = saxread(reader);

documentsetXMLEncoding("GBK");

Element root = documentgetRootElement();

// Document doc = readerread(read);

// Element root = docgetRootElement();

readNode(root, "");

public static void readNode(Element root, String prefix) {

if (root == null) return;

// 获取属性

List<Attribute> attrs = rootattributes();

if (attrs != null && attrssize() > 0) {

Systemerrprint(prefix);

for (Attribute attr : attrs) {

Systemerrprint(attrgetValue() + " ");

}

Systemerrprintln();

}

// 获取他的子节点

List<Element> childNodes = rootelements();

prefix += "\t";

for (Element e : childNodes) {

//输出内容

Systemerrprintln(egetName()+":"+egetData());

readNode(e, prefix);

}

}

可以通过元素中的getText方法获取到节点的内容。

举例:

SAXReader sax = new SAXReader();

Document document = saxread(reader);//reader为定义的一个字符串,可以转换为xml

Element root = documentgetRootElement();//获取到根节点元素String str = root getText()//获取到节点的内容

用到的是dom4j-161jar,需要引入的包是:

import orgdom4jDocument;

import orgdom4jDocumentException;

import orgdom4jElement;

import orgdom4jioSAXReader;

备注:如果是多个子节点可以通过”Element xx=root element("code")“获取到子节点的元素,前提是需要知道子节点的名称。

treepanel:

expandPath ( String path , [ String attr ], [ Function callback ] ) : void

展开当前TreePanel中的指定路径。可以使用 ExtdataNodegetPath 方法从一个节点中获取路径。

参数:

path : String

attr : String

可选 path中使用的参数(更多信息参见ExtdataNodegetPath)

callback : Function

可选 展开完成时的回调方法。回调方法将被传入以下参数: (bSuccess, oLastNode)。 bSuccess是展开是否成功标志,oLastNode为被展开的节点。

返回值:void

getNodeById ( String id ) : Node

根据id从树中获取节点

根据id从树中获取节点

参数:

id : String

返回值:Node

getRootNode () : Node

返回当前树的root节点

返回当前树的root节点

参数:

无。

返回值:Node

treenode:

getPath ( [ String attr ] ) : String

返回当前节点的路径。该路径可以用来编程展开或者选中当前节点。

返回当前节点的路径。该路径可以用来编程展开或者选中当前节点。

参数:

attr : String

(可选) 路径使用的参数(默认值为节点的id)

返回值:

String

路径

把这些方法组合下,然后你在写点逻辑代码,就能控制你想展开的任意节点了。

viewTreeexpandPath(viewTreegetRootNode()getPath());// 展开根节点

viewTreeexpandPath(viewTreegetNodeById (‘id’)getPath());// 展开id的那个节点

以上就是关于VBA读取XML节点全部的内容,包括:VBA读取XML节点、怎样用C语言从根节点搜索一棵树(非二叉树),找出特定值的节点最好有代码注释,谢谢!、Ext 中 treePanel节点自动全部展开问题;等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9317946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存