Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试将XInclude与Java结合使用,并使用xml:id解析片段_Java_Xml_Jaxp_Xinclude_Xpointer - Fatal编程技术网

尝试将XInclude与Java结合使用,并使用xml:id解析片段

尝试将XInclude与Java结合使用,并使用xml:id解析片段,java,xml,jaxp,xinclude,xpointer,Java,Xml,Jaxp,Xinclude,Xpointer,我一直在尝试让XInclude在我的XML文档中工作,最后让它在OxyXML中工作,我用它来编写XML文档 然后我转到了我的应用程序,它是用Java编写的,但它似乎不支持任何形式的XPointer解析,除了使用类似于:element(/1/2)的东西 显然,这是一个必须使用的糟糕方案,因为每次编辑文档时,XPointer都需要更改以反映节点在XML中的新位置 我使用的方案只是在目标文档中使用了xml:id: <foo> <bar xml:id="ABCD" />

我一直在尝试让XInclude在我的XML文档中工作,最后让它在OxyXML中工作,我用它来编写XML文档

然后我转到了我的应用程序,它是用Java编写的,但它似乎不支持任何形式的XPointer解析,除了使用类似于:element(/1/2)的东西

显然,这是一个必须使用的糟糕方案,因为每次编辑文档时,XPointer都需要更改以反映节点在XML中的新位置

我使用的方案只是在目标文档中使用了xml:id:

<foo>
    <bar xml:id="ABCD" />
</foo>
<lorem>
    <ipsum>
         <xi:include href="target.xml" xpointer="ABCD" />
    </ipsum>
</lorem>
然后它工作得非常好——但是,正如我所说的,这是一个非常糟糕的解决方案

我只是使用Java运行时(1.8)中包含的实现

以下是我使用的代码:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setXIncludeAware(true);
Source resultSource = new 
StreamSource(Gdx.files.internal("data/result.xsd").read());
            Source targetSource = new 
StreamSource(Gdx.files.internal("data/target.xsd").read());
            Source[] schemaFiles = {targetSource, resultSource};
            schema = 
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")
                    .newSchema(schemaFiles);
            factory.setSchema(schema);
            builder = factory.newDocumentBuilder();
            itemDoc = builder.parse(new 
InputSource(Gdx.files.internal("data/result.xml").read()));
根据(Java内部用于XML解析)

对于速记指针和element()xpointer,目前只支持DTD确定的ID

这意味着您需要将如下标记声明放入
target.xml
文件中(告诉xml解析器
id
属性将被视为具有
id
语义的属性,并告诉XInclude将“裸”XPointers解释为id引用):

然后Xerces将建立一个
文档
,其中XInclude处理已按需要执行(我已将示例数据放入
target.xml
文件中,该文件与
result.xml
文件位于同一目录中):


鉴于您也使用XML模式验证,我还想指出XInclude与XML模式的潜在交互作用,如中所述,以及中所讨论的潜在替代方案

谢谢-这似乎已经让它工作了,尽管我不得不使用DTD是一个极大的耻辱(imho)。然而,我可以接受它,因为它只是定义一个属性的一个很小的属性。考虑到这些技术有多古老,我真的很惊讶解析器不支持XML模式定义的ID——这将是理想的。有两种不同的XML供我使用您发布的备选方案,我已经很好地使用了XInclude和XML模式。
xpointer="element(/1/1)"
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setXIncludeAware(true);
Source resultSource = new 
StreamSource(Gdx.files.internal("data/result.xsd").read());
            Source targetSource = new 
StreamSource(Gdx.files.internal("data/target.xsd").read());
            Source[] schemaFiles = {targetSource, resultSource};
            schema = 
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")
                    .newSchema(schemaFiles);
            factory.setSchema(schema);
            builder = factory.newDocumentBuilder();
            itemDoc = builder.parse(new 
InputSource(Gdx.files.internal("data/result.xml").read()));
<!DOCTYPE foo [
  <!ATTLIST bar id ID #IMPLIED>
]>
<foo>
    <bar id="ABCD"/>
</foo>
<lorem xmlns:xi="http://www.w3.org/2001/XInclude">
  <ipsum>
    <xi:include href="target.xml" xpointer="ABCD"/>
  </ipsum>
</lorem>
<lorem xmlns:xi="http://www.w3.org/2001/XInclude">
  <ipsum>
    <bar id="ABCD" xml:base="target.xml"/>
  </ipsum>
</lorem>
import java.io.*;
import javax.xml.*;
import javax.xml.parsers.*;
import javax.xml.validation.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import org.w3c.dom.*;

public class t {

  public static void main(String[] args) {
    try {
      DocumentBuilderFactory factory =
        DocumentBuilderFactory.newInstance();
      factory.setNamespaceAware(true);
      factory.setXIncludeAware(true);
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document itemDoc = builder.parse(new File("result.xml"));
      System.out.println(serialize(itemDoc));
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  static String serialize(Document doc) throws Exception {
    Transformer transformer =
      TransformerFactory.newInstance().newTransformer();
    StreamResult result = new StreamResult(new StringWriter());
    DOMSource source = new DOMSource(doc);
    transformer.transform(source, result);
    return result.getWriter().toString();
  }
}