从包含名称空间前缀的xml字符串片段创建xom Document

时间:2015-07-23 08:21:50

标签: java xml xom

我有一个包含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");

但是在创建Document doc之前我无法看到如何做到这一点。 任何帮助,建议,赞赏。

1 个答案:

答案 0 :(得分:0)

一种解决方案是将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写出他修改过的片段。