【问题标题】:Creating dynamic xml tree based on the xpath value根据 xpath 值创建动态 xml 树
【发布时间】:2014-12-05 09:32:43
【问题描述】:

我想基于 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 中。并动态放置“valueOfSomething”的值。

【问题讨论】:

    标签: java jquery xml xpath treeview


    【解决方案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>
    

    【讨论】:

    • 你如何建议从soap响应中创建一个树视图,其中每个子元素可能包含不同的xpath,我已经阅读了每个子节点的xpath,将子节点添加到特定的xpath并创建一棵完整的树.
    • 我想更深入地了解 XML、Dom 和相关技术。请通过分享一些资源链接来帮助我,以便我将来也可以像您一样帮助社区成员。非常感谢您的真诚帮助。
    • 如果有办法在 ui(jsp) 页面中重现 Dom 内容,会更有帮助。因为当前的方式是在控制台中打印。
    • 这是一个广泛的问题和一个不同的问题。
    • 你能建议在java中相同的实现逻辑,以便我可以进一步使用它。我只想要 dom.evaluate(parts[i], node, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;在java中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2013-09-17
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多