2011-05-24 48 views
2

用手工代碼我的XML是這樣的:我可以把所有namspace定義頂級元素與JAXB

<?xml version="1.0" encoding="UTF-8"?> 
    <metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#" 
    xmlns:ext="http://musicbrainz.org/ns/ext-1.0#"> 
    <artist-list offset="0" count="8"> 
    <artist type="Person" id="00ed154e-8679-42f0-8f42-e59bd7e185af" 
    ext:score="100"> 

現在使用JAXB這是好多了,但雖然XML是完全有效的,我需要給力了把元數據元素中的xmlns:ext =「http://musicbrainz.org/ns/ext#-1.0」放在藝術家元素中,以便與我無法控制的客戶端代碼相互兼容。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#"> 
    <artist-list offset="0" count="4"> 
    <artist type="Person" id="00ed154e-8679-42f0-8f42-e59bd7e185af" 
    ext:score="100" xmlns:ext="http://musicbrainz.org/ns/ext#-1.0"> 

請問可以嗎?

編輯:工作了一它替換字符串,因爲我只需要對付一個特定的情況下

String xml = sw.toString(); 

    //Remove extension namespace definition 
    xml=xml.replace("xmlns:ext=\"http://musicbrainz.org/ns/ext#-1.0",""); 

    //Add it to the top instead 
    xml=xml.replace("<metadata xmlns=\"http://musicbrainz.org/ns/mmd-1.0#\">", 
        "<metadata xmlns=\"http://musicbrainz.org/ns/mmd-1.0#\" xmlns:ext=\"http://musicbrainz.org/ns/ext-1.0#\">"); 

    //Now write out to the proper output stream 
    out.write(xml); 
+0

使用字符串替換 – 2011-05-24 11:50:10

+0

如果現有元素中存在額外的空白,則替換將不起作用。 – jarnbjo 2011-05-24 13:43:10

+0

true,但最初的xml是由jaxb生成的,並且它總是生成相同的,所以在這種情況下這將始終有效。 – 2011-05-24 16:47:53

回答

0

我不認爲有一種方式使用JAXB做到這一點,但這裏有一個快速的後處理器使用Dom4J

public static void moveNameSpacesToRoot(Document document) { 
    final Element rootElement = document.getRootElement(); 
    moveNameSpacesToRootElement(rootElement, rootElement); 
} 

@SuppressWarnings("unchecked") 
private static void moveNameSpacesToRootElement(
    Element thisElement, Element rootElement) { 
    if (!thisElement.equals(rootElement)) { 
     Namespace namespace = thisElement.getNamespace(); 
     if (!namespace.equals(Namespace.NO_NAMESPACE)) { 
      Namespace existingRootNamespace = 
        rootElement.getNamespaceForPrefix(namespace.getPrefix()); 
      if (existingRootNamespace == null) { 
       rootElement.add(namespace); 
      } 
      thisElement.remove(namespace); 
     } 
    } 
    for (Element child : (List<Element>) thisElement.elements()) { 
     moveNameSpacesToRootElement(child, rootElement); 
    } 
} 

哦,我才意識到,你需要的屬性,不是元素。但是,這個改變是微不足道的,所以我會留給你的。

+0

謝謝,這是一個選項,但是因爲我真的不想引入依賴關係,並且將xml作爲字符串發回,所以我可能只是應用正則表達式來修復輸出 – 2011-05-24 10:52:05

+1

@user我明白,但那必須是一個正則表達式的地獄:-) – 2011-05-24 10:52:57

0

有一個在JAXB至少沒有記錄功能,以控制該元素的命名空間前綴聲明應置於。但是,您應該意識到,這兩個XML片段在語義上是相同的(如果名稱空間前綴在同一節點或任何祖先上聲明,則無關緊要),因此您應該選擇修復損壞的客戶端代碼或讓某人控制客戶端代碼來解決它。

+0

是的,我知道所有這些,正如我上面所述,但第三方客戶端需要時間來糾正,所以我現在需要修復現有客戶端的所有用戶(我沒有寫) – 2011-05-24 10:50:12