1

我有一个包含 xml 片段的文件。我需要在这个文件中添加一个子元素并重新保存它。我正在尝试在 Java (1.6) 中使用 xom。问题是文件中的数据包含命名空间前缀,所以当我构造我的 Document 对象时,我得到:

[致命错误] tsip:1:33: 与元素类型“publications”关联的属性“tsip:action”的前缀“tsip”未绑定

该文件包含例如:

<publications tsip:action="replace">
<publication tsip:dw="000000" tsip:status="dwpi:equivalent" tsip:lang="ja" tsip:drawings="0">
    <documentId>
        <number tsip:form="dwpi">58071346</number>
        <countryCode>JP</countryCode>
        <kindCode>A</kindCode>
    </documentId>
</publication>
</publications>

我的Java代码是:

FileInputStream fisTargetFile;

// Read file into a string
fisTargetFile = new FileInputStream(new File("C:\myFileName"));
pubLuStr = IOUtils.toString(fisTargetFile, "UTF-8");

Document doc = new Builder().build(pubLuStr, "");   // This fails

我怀疑我需要让代码命名空间知道,即添加如下内容:

doc.getRootElement().addNamespaceDeclaration("tsip", "http://schemas.thomson.com/ts/20041221/tsip");

但在创建文档文档之前,我看不到如何执行此操作。任何帮助,建议,不胜感激。

4

1 回答 1

1

一种解决方案是将 xml 片段读入字符串,然后将其包装在包含名称空间声明的虚拟标记中。例如:

        StringBuilder sb = new StringBuilder();
        sb.append("<tag xmlns:tsip=\"http://schemas.thomson.com/ts/20041221/tsip\">");
        String xmlFrag = new String(Files.readAllBytes(Paths.get("C:/myFileName")));
        sb.append(xmlFrag);
        sb.append("</tag>");
        Builder parser = new Builder();
        Document doc = parser.build(sb.toString(), null);

然后,您可以愉快地将字符串解析为 XOM 文档,并在保存修改后的片段之前添加所需的更改。要剥离包装器,您可以使用 XOM 通过搜索第一个真实标签来从文档中提取片段,例如

        Element wrapperRoot = doc.getRootElement();
        Element realRoot = root.getFirstChildElement("publications");

然后照常使用XOM写出他修改过的片段。

于 2015-08-06T16:43:21.963 回答