首页 > 解决方案 > 如何使用 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.

标签: javaxml

解决方案


您应该覆盖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);
}

推荐阅读