我想在xpath上创建一个动态xml树。我们说我的xpath值是
Product/Organization/RegisteredDetail/something
我希望以下列格式提供价值。
<product>
<organization>
<registeredDetail>
<something>valueOfSomething</something>
</registeredDetail>
</organization>
<product>
简而言之,我想通过读取xpath来创建树视图/树表。我想将值放在最内层的子节点上,并在树结构中显示值的位置,或者只是以树形式显示子节点的位置。 xpath的值将有所不同。任何使用java或jquery的建议都对我有价值。
我试图实施@ThW给出的建议。我做了一些修改:
var dom = document.implementation.createDocument("", "", null);
var node = dom;
新代码:
var pathmap = new Object();
var path1 = 'Product/Organization/RegisteredDetail/something';
var path2 = 'Product/Organization/RegisteredDetail';
var path3 = 'Product/Organization/RegisteredDetail/anything/nothing';
pathmap[path1] = 'Product/Organization/RegisteredDetail/something';
pathmap[path2] = 'Product/Organization/RegisteredDetail';
pathmap[path3] = 'Product/Organization/RegisteredDetail/anything/nothing';
console.log(pathmap);
for (var path in pathmap) {
var parts = path.split(/\//);
for (var i = 0; i < parts.length; i++) {
node = node.appendChild(dom.createElement(parts[i]));
}
node.appendChild(dom.createTextNode('valueOfSomething'));
}
var serializer = new XMLSerializer();
console.log(dom);
我得到的输出是
正如您所见,树节点正在重复。我需要添加它所属的valueOfSomething。如果节点存在不重新创建,只需添加一个新子节点。像这样的东西
<product>
<organization>
<registeredDetail>
valueOfSomethng
<something>valueOfSomethng</something>
<anything>
<nothing>valueOfSomethng</nothing>
</anything>
</registeredDetail>
</organization>
</product>
我打算将xpath和valueOfSomething的值放在hashMap中。并把&#39; valueOfSomething&#39;的价值动态。
答案 0 :(得分:1)
Xpath允许更多语法。结果不一定是可以解析为元素名称列表的东西。例如,/product//something
将选择产品中任何后代的某个节点。
如果您有一个元素名称列表,您可以轻松地从它们创建节点。 XPath可用于获取现有节点:
function addElementByPath(parent, path, value) {
var node = parent;
var parts = path.split(/\//);
var dom = parent.ownerDocument;
var existingNode;
for (var i = 0; i < parts.length; i++) {
existingNode = dom.evaluate(
parts[i], node, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null
).singleNodeValue;
if (existingNode) {
node = existingNode;
} else {
node = node.appendChild(dom.createElement(parts[i]));
}
}
node.appendChild(dom.createTextNode(value));
}
var paths = [
'Product/Organization/RegisteredDetail/something',
'Product/Organization/RegisteredDetail',
'Product/Organization/RegisteredDetail/anything/nothing',
'Some/OtherPath'
];
var dom = document.implementation.createDocument("", "", null);
var root = dom.appendChild(dom.createElement('tree'));
for (var i = 0; i < paths.length; i++) {
addElementByPath(root, paths[i], paths[i])
}
console.dirxml(dom);
输出:
<tree>
<Product>
<Organization>
<RegisteredDetail>
<something>Product/Organization/RegisteredDetail/something</something>
Product/Organization/RegisteredDetail
<anything>
<nothing>Product/Organization/RegisteredDetail/anything/nothing</nothing>
</anything>
</RegisteredDetail>
</Organization>
</Product>
<Some>
<OtherPath>Some/OtherPath</OtherPath>
</Some>
</tree>