控制台应用程序中测试 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 roottagroot
许多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 ElementTrue
>>> 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节点自动全部展开问题;等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)