2011-10-11 121 views
3

我已經看到了這個例子貼幾次:的XInclude支持6

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> 

和所有我回來了是內容a.xml,如上所述 - 沒有包含b.xml的一部分。我已經嘗試過xpointer語法無盡的變化無濟於事。然而,我已經能夠通過XML :: LibXML在perl中工作,但我需要這個工作在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 and XPointer/XPointer Syntax作爲參考 - 看來我應該能夠使用「簡寫」指針,但只有在NCName匹配某些ID類型屬性時纔可以使用。問題是我沒有定義「ID類型屬性」的DTD或模式。鑑於Java解析器不支持xpointer架構,是我唯一使用索引的選項嗎?

回答

3

xi前綴的命名空間應爲「http://www.w3.org/2001/XInclude」(note 2001 not 2003)。有關更多詳細信息,請參閱http://www.w3.org/TR/xinclude/

這會讓你看起來是下一個問題:元素方案xpointer的語法不正確。有關更多信息,請參閱http://www.w3.org/TR/xptr-element/

+0

謝謝,我知道我在做一些愚蠢的事情。 – foboz