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

2023-12-03

我一直在尝试让 XInclude 在我的 XML 文档中工作,最后让它在 Oxygen XML 中工作,我用 Oxygen XML 来编写 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>

我预计(并且正在吸入氧气)会产生如下结果:

<lorem>
    <ipsum>
         <bar xml:id="ABCD" />
    </ipsum>
</lorem>.

然而,在 Java 中它失败了:

将文件读取为 XML (href='data/target.xml') 时发生资源错误。原因: XPointer 解析失败。

但是,如果我更改包含标签以使用

xpointer="element(/1/1)"

那么它就可以很好地工作 - 但是,正如我所说,这是一个非常糟糕的解决方案。

我只是使用 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()));

根据Apache Xerces 关于 XInclude 的文档(Java内部用于XML解析)

对于简写指针和 element() XPointers,当前仅支持 DTD 确定的 ID。

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

<!DOCTYPE foo [
  <!ATTLIST bar id ID #IMPLIED>
]>
<foo>
    <bar id="ABCD"/>
</foo>

如果您现在使用以下文档作为源 XML(您已将其命名为result.xml在您的示例代码中,我对其进行了编辑以包含 XInclude 命名空间 URI 绑定xi)

<lorem xmlns:xi="http://www.w3.org/2001/XInclude">
  <ipsum>
    <xi:include href="target.xml" xpointer="ABCD"/>
  </ipsum>
</lorem>

那么 Xerces 将建立一个Document其中 XInclude 处理已根据需要执行(我已将示例数据放入target.xml文件与该文件位于同一目录中result.xml file):

<lorem xmlns:xi="http://www.w3.org/2001/XInclude">
  <ipsum>
    <bar id="ABCD" xml:base="target.xml"/>
  </ipsum>
</lorem>

我用来生成文档的 Java 代码是根据您的示例进行简化的,并且不包含第三方库:

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();
  }
}

鉴于您还使用 XML 模式验证,我还想指出 XInclude 与 XML 模式的潜在交互,例如。讨论于X包括架构/命名空间验证?,以及中讨论的潜在替代方案复制 XML 的某些部分而不重写它们 .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试将 XInclude 与 Java 结合使用并使用 xml:id 解析片段 的相关文章

随机推荐

  • 如何创建空的 Google 文档/电子表格

    创建空的 Google 文档 电子表格的最佳方法是什么 我现在正在使用 GData 文档 电子表格 API 但我更喜欢使用 Drive API 是否有一个 mimetype 可以创建一个空的 Google 文档 Google 电子表格 正如
  • 在哪里托管 Wakanda [客户端/服务器端纯 JS“框架”]?

    我最近发现Wakanda通过博客文章中的引用 这是开发纯 JavaScript 数据驱动应用程序的解决方案 客户端和服务器端的 JS 据我测试 该项目看起来很有前途 瓦坎达的JS框架WAF是开源的 由于我未能在瓦坎达的网站上找到答案 是否已
  • Pandas 解析列中的 json 并扩展到数据框中的新行

    我有一个包含 记录格式的 json 字符串的数据框 如下所示 In 9 pd DataFrame col1 A B col2 t 05 15 v 20 0 t 05 20 v 25 0 t 05 15 v 10 0 t 05 20 v 15
  • 如何制作SQL多对多同类型关系表

    我是 SQL 的新手 我首先尝试在编码时尽可能多地学习 这很困难 因为我正在设计数据库 我将不得不使用一段时间 所以我想要确保我做对了 我学习了多对多桥接表的基础知识 但是如果两个字段类型相同怎么办 假设有一个拥有数千名用户的社交网络 您将
  • CodeIgniter:设置闪存数据不起作用

    我使用以下代码来管理搜索结果中的分页 if this gt input gt post search notes is string this gt input gt post search notes is string this gt
  • 如何使 nth-child 使用嵌套标签?

    我试图让 nth child css 在嵌套标签上工作 但它似乎只适用于第一个标签和第二个标签 是否可以使其与多层嵌套标签一起使用 我试图将块引用上的边框设置为偶数和奇数标签之间的不同颜色 以便用户更轻松地可视化页面上的内容 test nt
  • Android:如何在 root 设备上执行 chmod

    我将在已取得 root 权限的 Android 2 1 设备上执行命令 字符串路径 data data com android providers settings databases settings db Runtime getRunt
  • Android:警报管理器

    这是代码 public void startAlarm Context context Intent intent new Intent context SyncService class PendingIntent sender Pend
  • Spring Java 配置包装注入的地图

    我最近从使用 Spring 的 XML 配置切换到使用 Java 配置 并且遇到了一个奇怪的问题 XML 配置是
  • 在一个程序集中序列化,然后在另一个程序集中反序列化?

    我在两个项目中有相同的课程 其中一个项目正在发送runtime到另一个进程 该进程必须反序列化该对象并使用它 假定两个对象相同但程序集名称不同 因此它们实际上被解释为两种不同的类型 根据我的研究 我提出了那些由于以下原因而不起作用的解决方案
  • 响应通知后按下后退按钮返回上一屏幕

    我正在使用类似的代码创建一个简单的通知创建并显示来自网络调用的通知 问题是 我希望响应通知的活动完成其业务 然后单击后退按钮 将先前活动的活动放回前台 并保持其后堆栈完好无损 这与之前的活动活动是我的应用程序还是其他人的应用程序的一部分无关
  • 从java以编程方式执行spark-submit

    我试图通过以下方式执行它 Process process Runtime getRuntime exec spark cmd 没有运气 通过 shell 运行的命令启动了我的应用程序 该应用程序成功了 通过 exec 运行它会启动一个进程
  • 如何在 Skyfield 中添加 JulianDate 对象或偏移

    The JulianDate对象在Skyfield是一种快速生成并保存一组儒略日时间值并将其传递给 Skyfield 的简便方法at 计算各种坐标中天文位置的方法 参见示例脚本 但是 我似乎找不到add or offset方法 以便我可以将
  • 如何删除/更新bigquery中的嵌套数据

    有没有办法删除 更新bigquery中的嵌套字段 假设我有这个数据 wives age wives name name 21 angel adam 20 kale 21 victoria rossi 20 jessica 或者在 json
  • 如何删除所有包含某个子字符串的PHP数组元素? [复制]

    这个问题在这里已经有答案了 好吧 我查了一些函数 但我似乎没有幸运地找到任何函数 我想过滤一个数组以删除包含某些字符串的特定数组 这是一个例子 array 1 gt January 2 gt February 3 gt March to r
  • jQuery document.createElement 等效吗?

    我正在重构一些旧的 JavaScript 代码 并且正在进行大量 DOM 操作 var d document var odv d createElement div odv style display none this OuterDiv
  • 从以 http 运行的网站使用 https 访问 CDN

    我正在开发一个网站 该网站将采用http 我试图包含来自 google cdn 的 jquery 给出的答案here says 使用协议相关的 URL 可让您轻松避免混合内容 安全错误 from 谷歌CDN 它被视为 我们建议您通过 HTT
  • 什么是指向数组数据开头的 Python 缓冲区对象?

    A np arange 12 B A reshape 3 4 A 0 42 print B print A print np may share memory A B print A data B data 运行上面的代码 令我惊讶的是pr
  • Cordova 网络 isOnline 仅在 WiFi 上返回 true

    以下仅当我有 WiFi 时才注销 在 4g 或任何移动互联网类型上则不然 看起来不太靠谱 有什么更好的检测在线 离线状态的想法吗 rootScope on cordovaNetwork online function event netwo
  • 尝试将 XInclude 与 Java 结合使用并使用 xml:id 解析片段

    我一直在尝试让 XInclude 在我的 XML 文档中工作 最后让它在 Oxygen XML 中工作 我用 Oxygen XML 来编写 XML 文档 然后我转到我的应用程序 用 Java 编写 但它似乎不支持任何形式的 XPointer