【问题标题】:How to create a a nested xml structure with two elements?如何创建具有两个元素的嵌套 xml 结构?
【发布时间】:2013-02-22 16:02:26
【问题描述】:

我正在尝试创建一个 xml 结构,例如:

<OuterMostElement>
  <NestedSet>
      <Element></Element>
      <Element></Element>
  </NestedSet>
</OuterMostElement>

我连续两次调用一个方法createNestedSet 来创建这个结构,并将&lt;OuterMostElement&gt; 文档片段传递给它。

   <OuterMostElement>
      <NestedSet>
          <Element></Element>
      </NestedSet>
      <NestedSet>
          <Element></Element>
      </NestedSet>
    </OuterMostElement>

方法是:

  public static void createNestedSet(DocumentFragment df) {
        if (oTargetLineProperties.isRendered()) {
            Document doc = df.getOwnerDocument();
            Element newParentElem = null;
            newParentElem = createTagIfAbsent(doc, "somenamespace", "NestedSet");
            Element newElem = null;
            newElem = doc.createElementNS("someNameSpace",
                                        "Element");

            newParentElem.appendChild(newElem);
            ((XMLElement)df.getFirstChild()).appendChild(newParentElem);
        }
    }

辅助方法createTagIfAbsent如下:

  private static Element createTagIfAbsent(Document doc, String nameSpace, String tagName) {
        Element newParentElem;
        NodeList nodes = doc.getElementsByTagName(tagName);
        //Already contains tag . So just return the existing one
        if(nodes!=null && nodes.getLength() > 0){
            newParentElem = (Element)nodes.item(0) ;
        }else{
            newParentElem = doc.createElementNS(nameSpace,tagName);  
        }

        return newParentElem;
    }

为什么要创建 NestedSet 标签,如果它不存在就不能正常工作?

【问题讨论】:

  • 没有直接回答你的问题,但为什么不创建一个更好的 API:createNestedSet( Document doc, List&lt;_NestedSet_&gt; set )

标签: java xml dom


【解决方案1】:

如果我没记错的话,你需要使用 getElementsByTagNameNS

http://docs.oracle.com/javase/1.4.2/docs/api/org/w3c/dom/Document.html#getElementsByTagNameNS%28java.lang.String,%20java.lang.String%29

要获取你想要获取的元素,传递正确的命名空间。

【讨论】:

    【解决方案2】:

    使用xStream 来编组这个类的一个实例:

    public class OuterMostElement {
       private final Set<Element> nestedSet = new HashSet<Element>();
    
       public void add(Element element) {
         nestedSet.add(element);
       }
    
       public static void main(String[] args) {
         XStream xstream = new XStream();
    
         OuterMostElement ome = new OuterMostElement();
         ome.add(new Element(1));
         ome.add(new Element(2));
    
         String result = xstream.toXml(ome);
         System.out.println(result);
    }
    

    【讨论】:

    • @Bors 你能看到我做错了什么吗?我已经简化了这些方法来给出简化的例子。在这里使用 XStream 不是一个选项。
    • @Geek 我提到你做错了什么,你没有在 getElementsByTagName 中提供命名空间,所以在 xml 中这不是同一种元素。
    猜你喜欢
    • 2014-11-24
    • 2022-12-11
    • 1970-01-01
    • 2014-03-13
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多