Поддержка XInclude в Java 6 - PullRequest
       19

Поддержка XInclude в Java 6

3 голосов
/ 11 октября 2011

Я видел этот пример, опубликованный несколько раз:

public class XIncludeTest {

  public static void main(String[] args) throws Exception {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      factory.setNamespaceAware(true);
      factory.setXIncludeAware(true);
      DocumentBuilder docBuilder = factory.newDocumentBuilder();
      System.out.println("isXIncludeAware " + docBuilder.isXIncludeAware());
      Document doc = docBuilder.parse(args[0]);

      Transformer transformer = TransformerFactory.newInstance().newTransformer();
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");

      //initialize StreamResult with File object to save to file
      StreamResult result = new StreamResult(new StringWriter());
      DOMSource source = new DOMSource(doc);
      transformer.transform(source, result);

      String xmlString = result.getWriter().toString();
      System.out.println(xmlString);    
    }
}

Я передаю этот простой XML-файл:

a.xml
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:xi="http://www.w3.org/2003/XInclude">
  <xi:include href="b.xml" xpointer="element(/b/c)"/>
  <xi:include href="b.xml" xpointer="element(/b/d)"/>
</a>

b.xml
<?xml version="1.0" encoding="UTF-8"?>
<b>
  <c>1</c>
  <d>2</d>
</b>

И все, что я получаю, это содержимое.xml, как указано выше - ни одна часть b.xml не была включена.Я пробовал бесконечные вариации синтаксиса xpointer безрезультатно.Однако я смог заставить все работать в perl через XML :: LibXML, но мне нужно это для работы в Java.

Что я не получаю?

Хорошо, теперь яя обновил мой xml-файл до того, что работает:

a.xml
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="b.xml" xpointer="element(/1/1)"/>
  <xi:include href="b.xml" xpointer="element(/1/2)"/>
</a>

Я бы предпочел не использовать смещения в документе - имена намного лучше (как в первой версии .xml).Я пытаюсь понять XPointer Framework и использую XPath и XPointer / XPointer Синтаксис в качестве справочного материала - кажется, я должен быть в состоянии использовать «сокращенный» указатель, нотолько если NCName соответствует некоторому атрибуту типа ID.Проблема в том, что у меня нет DTD или схемы, которая определяет «атрибут типа ID».Учитывая, что анализатор Java не поддерживает схему xpointer, могу ли я использовать только индексы?

1 Ответ

3 голосов
/ 11 октября 2011

Пространство имен для префикса xi должно быть "http://www.w3.org/2001/XInclude" (примечание 2001, а не 2003). См. http://www.w3.org/TR/xinclude/ для получения дополнительной информации.

Это приводит вас к следующей проблеме: неверный синтаксис вашей схемы элемента xpointer. См. http://www.w3.org/TR/xptr-element/ для получения дополнительной информации.

...