[英]Creating dynamic xml tree based on the xpath value
I want to create a dynamic xml tree base on the xpath. 我想在xpath上创建一个动态xml树。 Let's say my xpath value is 假设我的xpath值是
Product/Organization/RegisteredDetail/something
and I want to put value in the following format. 我想以以下格式输入值。
<product>
<organization>
<registeredDetail>
<something>valueOfSomething</something>
</registeredDetail>
</organization>
<product>
In short I want to create a treeview/tree table by reading xpath. 简而言之,我想通过阅读xpath创建一个treeview / tree表。 I want to put the value at the inner most child and show the location of value in a tree structure Or simply the location of the child in a tree form. 我想将值放在最里面的子项上,并在树结构中显示值的位置,或者仅以树形形式显示子项的位置。 The value of the xpath will be vary. xpath的值将有所不同。 Any suggestion using java or jquery will be valuable for me. 使用java或jquery的任何建议对我来说都是有价值的。
I tried to implement suggestion given by @ThW. 我试图实现@ThW给出的建议。 I made some modifications: 我做了一些修改:
var dom = document.implementation.createDocument("", "", null);
var node = dom;
New code: 新代码:
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);
and the output I got is 我得到的输出是
As you can see tree nodes are repeating. 如您所见,树节点在重复。 I need to add the valueOfSomething where it belongs. 我需要在其中添加valueOfSomething。 If the node exist don't recreate that, simply add a new child. 如果该节点存在,则不要重新创建该节点,只需添加一个新的子节点即可。 something like this 像这样的东西
<product>
<organization>
<registeredDetail>
valueOfSomethng
<something>valueOfSomethng</something>
<anything>
<nothing>valueOfSomethng</nothing>
</anything>
</registeredDetail>
</organization>
</product>
I am planning to put the value of xpath and valueOfSomething in a hashMap. 我打算将xpath和valueOfSomething的值放在hashMap中。 and put the value of 'valueOfSomething' dynamically. 并动态放置“ valueOfSomething”的值。
Xpath allows for a lot more syntax. Xpath允许更多语法。 An the result is not necessary something that can be parsed into a list of element names. 结果不是必需的,可以将其解析为元素名称列表。 For example /product//something
will select any descendant something node in product. 例如, /product//something
将选择/product//something
任何后代的something节点。
If you have a list of elements names you can easily create nodes from them. 如果您具有元素名称的列表,则可以轻松地从中创建节点。 XPath can be used to fetch existing nodes: 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);
Output: 输出:
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.