簡體   English   中英

通過JAXB解析XML的可選命名空間

[英]Optional Namespace parsing XML via JAXB

在我的應用程序中,用戶上傳了幾個XML。 很少有上載的XML不包含名稱空間標簽,而其他XML包含名稱空間標簽。 我希望能夠同時支持這兩種上傳。 JAXB對前者給予例外。

我希望能夠將名稱空間設置為可選,即支持兩個文件。

有效的XML

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns2:transforms xmlns:ns2="http://www.mynamesapace.com/xmlbeans/connectorconfig">

失敗的XML

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<transforms>

這是我解組XML的方式

  JAXBContext jaxbContext = JAXBContext.newInstance(Transforms.class);
  Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
  transforms = (Transforms) jaxbUnmarshaller.unmarshal(file);

這是我的情話

@XmlRootElement(name = "transforms", namespace = 
"http://www.mynamesapace.com/xmlbeans/connectorconfig")
public class Transforms implements ConfigDiffable<Transforms, 
ChangedTransforms> {
.....

更新

如果我刪除

namespace = 
    "http://www.mynamesapace.com/xmlbeans/connectorconfig"

沒有名稱空間的XML開始工作

創建一個類:

class XMLReaderWithoutNamespace extends StreamReaderDelegate {
  public XMLReaderWithoutNamespace(XMLStreamReader reader) {
    super(reader);
  }

  @Override
  public String getAttributeNamespace(int arg0) {
    return "";
  }

  @Override
  public String getNamespaceURI() {
    return "";
  }
}

將您的解組更改為:

JAXBContext jaxbContext = JAXBContext.newInstance(Transforms.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
InputStream is = new FileInputStream(file);
XMLStreamReader xsr = XMLInputFactory.newFactory().createXMLStreamReader(is);
XMLReaderWithoutNamespace xr = new XMLReaderWithoutNamespace(xsr);
transforms = (Transforms) jaxbUnmarshaller.unmarshal(xr);

測試時,我在pojo中沒有定義名稱空間。

從這個答案中得出的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM