用dom4j操作寫XML文件,標簽中含有冒號,會報 org.dom4j.IllegalAddException: No such namespace prefix: *** is in scope on: org.dom4j.tree.DefaultElement錯誤,大致意思就是說,冒號前面的內容是未定義的命名空間,那么我們就幫它定義一下,問題即可解決,看下面例子:
這是我需要生成的XML,標簽包含 ofd:
<?xml version="1.0" encoding="UTF-8"?> <ofd:Signature xmlns:ofd="http://www.ofdspec.org/2016"> <ofd:SignedInfo> <ofd:Provider ProviderName="Eseal" Company="XXX" Version="1.0"/> <ofd:SignatureMethod>123456789</ofd:SignatureMethod> <ofd:SignatureDataTime>988746454656</ofd:SignatureDataTime> <ofd:Reference FileRef="文件地址"> <ofd:CheckValue>qqqqqqqqqqqqqqqqqqqqq</ofd:CheckValue> </ofd:Reference> <ofd:StampAmot PageRef="1" ID="index" Boundary="10.0 20.0 30.0 40.0"/> <ofd:Seal> <ofd:BaseLoc>Seal.esl</ofd:BaseLoc> </ofd:Seal> </ofd:SignedInfo> <ofd:SignedValue>SignedValue.dat</ofd:SignedValue> </ofd:Signature>
代碼操作的時候,在根節點用
addNamespace("name","dnsURL")
添加命名空間即可,代碼比較簡單,不做贅述:
import java.io.FileWriter; import java.io.IOException; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class generateXMLTest{ public static void main(String[] args) { generateSignature("E:\\test.xml"); } public static void generateSignature(String fileAddress) { FileWriter out = null; try { out = new FileWriter(fileAddress); createDocument().write(out); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); XMLWriter writer = new XMLWriter(System.out, format);//設置XML編碼 writer.write(createDocument()); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static Document createDocument() { Document document = DocumentHelper.createDocument(); Element root = document.addElement("ofd:Signature") .addAttribute("xmlns:ofd","http://www.ofdspec.org/2016").addNamespace("ofd", "http://www.ofdspec.org/2016");//在此為ofd:添加命名空間 Element SignedInfo = root.addElement("ofd:SignedInfo"); Element Provider = SignedInfo.addElement("ofd:Provider") .addAttribute("ProviderName", "Eseal") .addAttribute("Company", "XXX") .addAttribute("Version", "1.0"); Element SignatureMethod = SignedInfo.addElement("ofd:SignatureMethod"); SignatureMethod.setText("123456789"); Element SignatureDataTime = SignedInfo.addElement("ofd:SignatureDataTime"); SignatureDataTime.setText("988746454656"); Element Reference = SignedInfo.addElement("ofd:Reference") .addAttribute("FileRef", "文件地址"); Element CheckValue = Reference.addElement("ofd:CheckValue"); CheckValue.setText("qqqqqqqqqqqqqqqqqqqqq"); Element StampAmot = SignedInfo.addElement("ofd:StampAmot") .addAttribute("PageRef", "1") .addAttribute("ID", "index") .addAttribute("Boundary", "10.0 20.0 30.0 40.0"); Element BaseLoc = SignedInfo.addElement("ofd:Seal").addElement("ofd:BaseLoc"); BaseLoc.setText("Seal.esl"); Element SignedValue = root.addElement("ofd:SignedValue"); SignedValue.setText("SignedValue.dat"); return document; } }
