为什么org.w3c.dom.DocumentBuilder偷偷地将属性添加到XML元素

时间:2016-08-04 21:45:48

标签: java xml dtd

经过几天的混乱并尝试使用不同的库来验证带有XSD的XML文档(根据XSD,我100%肯定是有效的),我终于发现了失败的原因{ {1}}和org.w3c.dom.DocumentBuilder决定将一堆属性隐藏到DOM中。以下是我收到的许多验证错误之一:

  

价值' 127'属性" high_value_range'元素' API_Version'对于相应的属性使用无效。属性' high_value_range'具有固定值' 4294967295'。

正如您在此示例org.w3c.dom.Document文件中看到的那样,我指定属性test.xml

'high_value_range'

以下是解析XML文件并打印DOM的代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE My_Doc SYSTEM "MyDoc.dtd">
<My_Doc xmlns="http://my.namespace.org">
  <Package>
    <API_Version>1</API_Version>
  </Package>
</My_Doc>

最后,打印出已解析的package client; import java.io.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.w3c.*; import org.w3c.dom.*; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class Writer { //method to convert Document to String public static String getStringFromDocument(Document doc) { try { DOMSource domSource = new DOMSource(doc); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); TransformerFactory tf = TransformerFactory.newInstance(); javax.xml.transform.Transformer transformer = tf.newTransformer(); transformer.transform(domSource, result); return writer.toString(); } catch(TransformerException ex) { ex.printStackTrace(); return null; } } public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc; doc = dBuilder.parse(new File("data/test.xml")); System.out.println(getStringFromDocument(doc)); } } 的结果以及后续验证失败的原因:

Document

以下是重现的<?xml version="1.0" encoding="UTF-8" standalone="no"?> <My_Doc xmlns="http://my.namespace.org" element_tag="GROUP" element_type="GROUP"> <Package> <API_Version element_type="FIELD" field_type="INTEGER" value_upper_range="127">1</API_Version> </Package> </My_Doc>

MyDoc.dtd

为什么<?xml version='1.0' encoding='UTF-8' ?> <?My_Application DTD_Version='6.5'?> <!ELEMENT My_Doc (Package)> <!ATTLIST My_Doc element_tag CDATA #FIXED 'GROUP' element_type CDATA #FIXED 'GROUP' xmlns CDATA #FIXED 'http://my.namespace.org' > <!ELEMENT Package (API_Version)> <!ELEMENT API_Version (#PCDATA)> <!ATTLIST API_Version element_type CDATA #FIXED 'FIELD' field_type CDATA #FIXED 'INTEGER' high_value_range CDATA #FIXED '127' > <?DTD_End Dummy_Processing_Instruction='END'?> 会添加所有额外的东西,我该如何阻止它呢?

1 个答案:

答案 0 :(得分:3)

解析启用了DTD验证的文档时,DTD中定义的默认属性值将插入到已解析的文档中。如果您不希望这种情况发生,那么要么不定义DTD,要么禁止DTD验证,或者禁止扩展DTD定义的属性默认值。 (如果您使用的TransformerFactory是Saxon,而不是Xalan,我可以告诉您如何做到这一点)。