当前位置: 首页 > 知识库问答 >
问题:

EclipseLink MOXY:XmlPath注释中的逻辑运算符

鞠乐
2023-03-14

例如,我希望在绑定文件中包含如下内容:

    <java-type name="Content">
        <java-attributes>
           <xml-element java-attribute="elements" xml-path="/a/b/ | /c/d" 
            type="ElementType" container-type="java.util.List" />
        </java-attributes>
    </java-type>

有没有一种方法可以通过修改绑定而不使用XML路径中的逻辑or来获得同样的结果?

我只能想到一个解决办法,在域模型中使用getter和设置,将/a/b/c/d绑定到元素,并让setter将元素追加到列表,而不是在每次调用setElements()时替换列表。不过,我宁愿在绑定文件中处理它。

文档中是否有指定MOXY支持XPath的哪些部分的地方?

共有1个答案

令狐新翰
2023-03-14

下面是一个如何支持这个用例的示例。

映射文档(bindings.xml

对于这个用例,您可以使用xml-elements映射。在每个嵌套的xml-element映射中,您将指定不同的xml-path

<?xml version="1.0"?>
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum17977009">
    <java-types>
        <java-type name="Content">
            <xml-root-element/>
             <java-attributes>
                <xml-elements java-attribute="elements">
                    <xml-element xml-path="a/b"/>
                    <xml-element xml-path="c/d"/>
                </xml-elements>
             </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>
package forum17977009;

import java.util.List;

public class Content {

    private List<ElementType> elements;

    public List<ElementType> getElements() {
        return elements;
    }

    public void setElements(List<ElementType> elements) {
        this.elements = elements;
    }


}

要将MOXy指定为您的JAXB提供程序,您需要在与您的域模型相同的包中包含一个名为JAXB.properties的文件,其中包含以下条目(请参见:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

输入(Input.xml)

下面是一个输入文档示例。

<?xml version="1.0" encoding="UTF-8"?>
<content>
    <a>
        <b/>
        <b/>
    </a>
    <c>
        <d/>
        <d/>
    </c>
</content>

下面是一些演示代码,您可以运行以证明一切正常:

package forum17977009;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum17977009/bindings.xml");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Content.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum17977009/input.xml");
        Content content = (Content) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(content, System.out);
    }

}

输出

由于所有项的类型相同,因此它们将基于xml-elements映射中第一个xml-elementxml-path进行输出:

<?xml version="1.0" encoding="UTF-8"?>
<content>
   <a>
      <b/>
      <b/>
      <b/>
      <b/>
   </a>
</content>

以下是一些应该有所帮助的例子:

  • http://blog.bdoughan.com/2010/07/xpath-based-mapping.html
  • http://blog.bdoughan.com/2011/03/Map-to-element-based-on-attribute-value.html
  • http://blog.bdoughan.com/2010/09/xpath-based-mapping-geocode-example.html

我们将对为映射输入的XPath语句添加一些验证。您可以使用以下链接跟踪我们在这方面的进展:

    null
 类似资料:
  • and, or, not 其中,and 和 or 与 C 语言区别特别大。 在这里,请先记住,在 Lua 中,只有 false 和 nil 才计算为 false,其它任何数据都计算为 true,0 也是 true! and 和 or 的运算结果不是 true 和 false,而是和它的两个操作数相关。 a and b: 如果 a 为 false,则返回 a;否则返回 b a or b: 如果 a

  • 2.2.1关系表达式 a) 关系运算符 关系运算符就是关系比较符。Fortran中有六个关系运算符: 关系运算符 英语含义 所代表的数学符号 .GT. .GE. .LT. .LE. .EQ. .NE. > >= < <= == /= Greater Than Greater than or Equal to Less Than Less than or Equal to EQual to Not

  • JavaScript 中有三个逻辑运算符:||(或),&&(与),!(非)。 虽然它们被称为“逻辑”运算符,但这些运算符却可以被应用于任意类型的值,而不仅仅是布尔值。它们的结果也同样可以是任意类型。 让我们来详细看一下。 ||(或) 两个竖线符号表示“或”运算符: result = a || b; 在传统的编程中,逻辑或仅能够操作布尔值。如果参与运算的任意一个参数为 true,返回的结果就为 tr

  • 问题内容: 在阅读python中的逻辑运算符时,我遇到了一些表达式: 输出1 输出:5 谁能解释这是如何工作的? 我知道, 操作数 的的 逻辑 运算符是 布尔 问题答案: 有据可查: 两者都短路(例如,如果为 真,则不会评估)。 __ 该文档还指出了被认为 falsy (,,,空序列/映射,…) -一切被认为是 truthy 。 一些例子: 请注意,最后两个如何显示短路行为:不执行第二个语句(将引

  • 问题内容: 运算符和有什么不一样?和运算符|| ?? 而且&和&& ??有什么区别? 谢谢… 问题答案: 主要区别在于,在表达式中,如果为false,则不会进行计算,而在两者中,无论如何都将进行计算。可以说是“ 短路 ”评估。 同样,对于:如果为true,则不会进行评估,而对于两者而言,则无论如何都将被评估。

  • 2.4.2 逻辑运算 仅用简单布尔表达式是不够的,复杂条件需要用复杂布尔表达式来描述。将多个简单布 尔表达式用逻辑运算符联结起来,即可构成复杂布尔表达式。Python 语言支持的逻辑运算 符有三个:and、or 和 not。 逻辑运算符 and 逻辑运算符 and 联结两个布尔表达式,并得到一个新的布尔表达式。形如: <布尔表达式 1> and <布尔表达式 2> 新表达式的值依赖于参加 and