基于xpath值创建动态xml树

时间:2014-10-10 08:58:57

标签: java jquery xml xpath treeview

我想在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);

我得到的输出是 enter image description here

正如您所见,树节点正在重复。我需要添加它所属的valueOfSomething。如果节点存在不重新创建,只需添加一个新子节点。像这样的东西

<product>
       <organization>
             <registeredDetail>
                            valueOfSomethng
                             <something>valueOfSomethng</something>
                             <anything>
                                     <nothing>valueOfSomethng</nothing>
                             </anything>
            </registeredDetail>
        </organization>
</product>

我打算将xpath和valueOfSomething的值放在hashMap中。并把&#39; valueOfSomething&#39;的价值动态。

1 个答案:

答案 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>