我有一个包含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之前我无法看到如何做到这一点。 任何帮助,建议,赞赏。
答案 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写出他修改过的片段。