java - 如何使用 XMLBeam 将元素插入现有文档?
问题描述
我需要使用XMLBeam将新元素插入到现有文档中。我可以从头开始创建文档并阅读现有文档,但在插入时遇到了困难。 如何插入一个新元素,如示例 XML 中的以下注释所示,例如 id 为 3?
假设我有这个 XML:
<p:PEOPLE xmlns:p="people-namespace">
<p:PERSON id="1">
<p:FIRST_NAME>John</p:FIRST_NAME>
<p:LAST_NAME>Smith</p:LAST_NAME>
</p:PERSON>
<p:PERSON id="2">
<p:FIRST_NAME>Sally</p:FIRST_NAME>
<p:LAST_NAME>Green</p:LAST_NAME>
</p:PERSON>
<!-- How to add a new PERSON here with id = 3 ?? -->
</p:PEOPLE>
以及这些投影界面:
interface PeopleData {
@XBRead("/p:PEOPLE")
List<Person> getAllPeople();
}
interface Person {
@XBRead("@id")
int getPersonId();
@XBRead("p:FIRST_NAME")
String getFirstName();
@XBRead("p:LAST_NAME")
String getLastName();
}
我正在读取数据,如下所示:
new XBProjector().io().file("some file name").read(PersonData.class);
我使用 Saxon 作为 XPath 引擎,并在工厂配置中设置了命名空间上下文,如下所示:
@Override
public XPath createXPath(Document... document) {
XPathFactory factory = new XPathFactoryImpl();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new PeopleNamespaceContext());
return xpath;
}
我尝试了几种不同的方法,但一直遇到这个异常:
org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
解决方案
您应该覆盖DefaultXMLFactoriesConfig.getUserDefinedNamespaceMapping方法
@Override
public Map<String, String> getUserDefinedNamespaceMapping() {
return Collections.singletonMap("p", "people-namespace");
}
投影
interface PeopleData {
@XBRead("/p:PEOPLE/p:PERSON")
List<Person> getAllPeople();
@XBWrite("/p:PEOPLE/p:PERSON[@id='{0}']")
PeopleData setPerson(int id, @XBValue Person p);
}
推荐阅读
- c# - Microsoft Access 的 OleDbConnection.State 问题
- python - 如何检查是否在 tkinter python 中编辑了文本小部件?
- mysql - mysql上END附近的事件计划错误标记
- java - 在 onComplete 方法中实现接口的问题
- python - 在 python 中与 linux 控制台交互
- java - Android 应用程序语言随处变化,但在菜单和选项卡布局标题中没有变化
- python - 如何删除数据库中带有条件的行?
- python - model.predict_generator() 中的死锁与 use_multiprocessing=True
- r - 为什么 car 包中的 vif() 结果与 lmridge R 中的结果不同?
- php - PHP根据输入向上/向下缩放数字?