2013-12-06 6 views
0

У меня есть XSD, который описывает пользовательскую схему и импортирует XLink (другая схема).Как создать XML-документ с несколькими схемами в Java?

Импорт производится с помощью следующей декларации его основного XSD:

<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlink.xsd"/> 

xlink.xsd файла на самом деле находятся рядом с главным XSD.

Затем я настраиваю строителей со следующим кодом

static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; 
static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; 
static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; 
static final String MY_SCHEMA_FILENAME = "mydir/myfile.xsd"; 
static final String MY_DATA_FILENAME = "mydir/myfile.xml"; 

factory = DocumentBuilderFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     factory.setValidating(true); 
     try { 
      factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); 
      factory.setAttribute(JAXP_SCHEMA_SOURCE, new File(MY_SCHEMA_FILENAME)); 
     } 
     catch (IllegalArgumentException e) { 
      throw new AssertionError(e); 
     } 

     try { 
      builder = factory.newDocumentBuilder(); 
     } 
     catch(ParserConfigurationException e) { 
      throw new AssertionError(e); 
     } 

, когда я готовлю документ в памяти, я установил атрибут следующим образом

imageElement.setAttribute("xlink:href", mypathvariable); 

я ожидаю, это создаст тег, который описан следующим образом в XSD

     <xs:element name="image"> 
          <xs:complexType> 
           <xs:attribute ref="xlink:href" use="required"/> 
          </xs:complexType> 
         </xs:element> 

При создании ev erything работает без ошибок, но при сохранении с кодом

 TransformerFactory transformerFactory = TransformerFactory.newInstance(); 

     Transformer transformer = transformerFactory.newTransformer(); 

     DOMSource source = new DOMSource(doc); 

     StreamResult result = new StreamResult(new File(MY_DATA_FILENAME)); 

     transformer.transform(source, result); 

следующее сообщение об ошибке:

ERROR: 'Namespace for prefix 'xlink' has not been declared.' 

Где моя ошибка?

+0

У вас есть пространство имен, объявленное в xlink.xsd? – Keerthivasan

ответ

1

Используйте setAttributeNS вместо этого, что-то вроде этого:

imageElement.setAttributeNS("http://www.w3.org/1999/xlink", "href", mypathvariable); 

Если вы хотите придерживаться:

imageElement.setAttribute("xlink:href", mypathvariable); 

Затем убедитесь, что у вас есть это определенный (как правило, на корневой элемент), на некоторых который предоставляет область применения, к которой добавляется ваш атрибут:

someElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); 

Вышеупомянутое также показывает, как управлять префиксом в целом.

 Смежные вопросы

  • Нет связанных вопросов^_^