代码之家  ›  专栏  ›  技术社区  ›  Jonas

如何只在带有XOM的第一个标记上设置名称空间?

  •  2
  • Jonas  · 技术社区  · 15 年前

    我正在使用 XOM 在Java中构建XML文档。

    我创建了一个简单的XML文档,需要一个XML名称空间。但是当我在第一个标记上设置名称空间时,在子标记上设置了一个空名称空间,就像 xmlns="" 我怎样才能摆脱这种行为?我只想要 xmlns 在第一个标签上。

    我想要这个XML:

    <request xmlns="http://my-namespace">
        <type>Test</type>
        <data>
            <myData>test data</myData>
        </data>
    </request>
    

    但这是XOM的XML文档输出

    <request xmlns="http://my-namespace">
        <type xmlns="">Test</type>
        <data xmlns="">
            <myData>test data</myData>
        </data>
    </request>
    

    这是我的Java XOM代码:

    String namespace = "http://my-namespace";
    Element request = new Element("request", namespace);
    
    Element type = new Element("type");
    type.appendChild("Test");
    
    request.appendChild(type);
    
    Element data = new Element("data");
    request.appendChild(data);
    
    Element myData = new Element("myData");
    myData.appendChild("test data");
    data.appendChild(myData);
    
    Document doc = new Document(request);
    doc.toXML();
    
    3 回复  |  直到 9 年前
        1
  •  8
  •   Catchwa    15 年前

    这对我有用。但是,我有点困惑为什么 Element 但是,对象不继承其父对象的命名空间。(不是XML或XOM专家)

    代码:

    String namespace = "http://my-namespace";
    Element request = new Element("request", namespace);
    
    Element type = new Element("type", namespace);
    type.appendChild("Test");
    
    request.appendChild(type);
    
    Element data = new Element("data", namespace);
    request.appendChild(data);
    
    Element myData = new Element("myData", namespace);
    myData.appendChild("test data");
    data.appendChild(myData);
    
    Document doc = new Document(request);
    System.out.println(doc.toXML());
    

    输出:

    <?xml version="1.0"?>
    <request xmlns="http://my-namespace">
      <type>Test</type>
      <data>
        <myData>test data</myData>
      </data>
    </request>
    
        2
  •  2
  •   bovineone    13 年前

    我也遇到了同样的问题,谷歌引领我来到这里。

    @迈克尔-这就是它在JavaDoc中所说的,是的,但不幸的是,当您实现它时,它并不是这样工作的。除非您执行catchwa的实现,否则子元素将继续获得空白的xmlns属性。

    Catchwa的实现工作很好。只有我告诉它有名称空间的元素才有名称空间。所有空xmlns属性都不存在。真奇怪。

    是虫子吗?我好像想不出那部分。还是XOM的工作方式?

        3
  •  1
  •   Elliotte Rusty Harold    9 年前

    不要混淆名称空间和名称空间声明。命名空间是每个元素的固有属性。命名空间声明是“xmlns”属性。它们是不同的,尽管它们是相连的。创建元素时,设置其命名空间,而不是其命名空间声明。

    在XOM数据模型中,名称空间不是属性。它们是元素本身的固有属性。XML中没有规则要求元素的子级与父级位于同一命名空间中。实际上,理论上,文档中的每个元素都可以位于不同的名称空间中。

    在XOM中,可以在指定本地名称的同时指定元素或属性的命名空间。当您创建一个元素时,元素最初没有父元素,因此XOM不可能默认为元素提供与其父元素相同的命名空间,即使这是需要的(而不是)。

    文档序列化时,命名空间由 xmlns xmlns:*prefix* 属性。XOM找出将这些元素放在哪里,以匹配您分配给每个元素的名称空间。只需为代码中的每个元素指定所需的名称空间,并让XOM找出将名称空间声明放在哪里。