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

具有complexContent、限制和属性的jaxb元素

贺宏逸
2023-03-14
<OrderItemList>
    <ItemCount>2</ItemCount>
    <OrderItem Sequence="1">
      <ItemId>12345</ItemId>
      <Quantity>1</Quantity>
      <DiscountId>prm</DiscountId>
      <DiscountPercent>3.5</DiscountPercent>
    </OrderItem>
    <OrderItem Sequence="1">
      <ItemId>44523</ItemId>
      <Quantity>3</Quantity>
      <DiscountId>nil</DiscountId>
      <DiscountPercent>0</DiscountPercent>
    </OrderItem>
</OrderItemList>

我得到以下错误:

16:15:28,564 WARN  [OrderItemValidate] [error] null : cvc-complex-type.3.2.2: Attribute 'Sequence' is not allowed to appear in element 'OrderItem'.
16:15:28,565 ERROR [OrderItemValidate] org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 24; cvc-complex-type.3.2.2: Attribute 'Sequence' is not allowed to appear in element 'OrderItem'.
org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 24; cvc-complex-type.3.2.2: Attribute 'Sequence' is not allowed to appear in element 'OrderItem'.

22:05:09,966 WARN  [OrderItemValidate] [error] null : cvc-complex-type.2.4.a: Invalid content was found starting with element 'TotalCount'. One of '{"www.myapp.com":OrderItem}' is expected.
22:05:09,967 ERROR [OrderItemValidate] org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 17; cvc-complex-type.2.4.a: Invalid content was found starting with element 'TotalCount'. One of '{"www.myapp.com":OrderItem}' is expected.
org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 17; cvc-complex-type.2.4.a: Invalid content was found starting with element 'TotalCount'. One of '{"www.myapp.com":OrderItem}' is expected.

我尝试了以下几种方式,

 * <complexType name="OrderItem">
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <all>
 *         <attribute name="Sequence" type="{www.myapp.com}Integer" use="required"/>
 *         <element name="ItemId" type="{www.myapp.com}String" minOccurs="0"/>
 *         <element name="Quantity" type="{www.myapp.com}Integer" minOccurs="0"/>
 *         <element name="DiscountId" type="{www.myapp.com}Number" minOccurs="0"/>
 *         <element name="DiscountPercent" type="{www.myapp.com}Number" minOccurs="0"/>
 *       </all>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 * 
  •   <ItemId>12345</ItemId>
      <Quantity>1</Quantity>
      <DiscountId>prm</DiscountId>
      <DiscountPercent>3.5</DiscountPercent>
    

共有1个答案

欧阳杰
2023-03-14

我需要为以下XML模型实现JAXB

选项1-从Java类开始

您可以从Java对象开始并执行以下操作:

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="OrderItemList")
@XmlType(propOrder={"itemCount", "orderItems"})
@XmlAccessorType(XmlAccessType.FIELD)
public class OrderItemList {

    @XmlElement(name="OrderItem")
    private List<OrderItem> orderItems = new ArrayList<OrderItem>();

    @XmlElement(name="ItemCount")
    public int getItemCount() {
        return orderItems.size();
    }

}

订单项

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class OrderItem {

    @XmlAttribute(name="Sequence")
    private int sequence;

    @XmlElement(name="ItemId")
    private int itemId;

    @XmlElement(name="Quantity")
    private int quantity;

    @XmlElement(name="DiscountId")
    private String discountId;

    @XmlElement(name="DiscountPercent")
    private float discountPercent;

}

选项2-从XML模式开始

您不需要从XML模式生成模型。但如果您愿意,XML模式可以如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="OrderItemList" type="orderItemList"/>

  <xs:complexType name="orderItemList">
    <xs:sequence>
      <xs:element name="ItemCount" type="xs:int"/>
      <xs:element name="OrderItem" type="orderItem" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="orderItem">
    <xs:sequence>
      <xs:element name="ItemId" type="xs:int"/>
      <xs:element name="Quantity" type="xs:int"/>
      <xs:element name="DiscountId" type="xs:string" minOccurs="0"/>
      <xs:element name="DiscountPercent" type="xs:float"/>
    </xs:sequence>
    <xs:attribute name="Sequence" type="xs:int" use="required"/>
  </xs:complexType>

</xs:schema>
import java.io.IOException;
import javax.xml.bind.*;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

public class GenerateSchema {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(OrderItemList.class);
        jc.generateSchema(new SchemaOutputResolver() {

            @Override
            public Result createOutput(String namespaceUri, String suggestedFileName)
                    throws IOException {
                StreamResult result = new StreamResult(System.out);
                result.setSystemId(suggestedFileName);
                return result;
            }
        });
    }

}
 类似资料:
  • 我正在使用JAXB来解封xml文件。这是我的元素特性代码,但是我想在元素特性中有一个特殊的元素顺序,像这样 我检查了一些@XmlType教程(propOrder = {}),但我找不到一种方法来订购元素列表,如这里的属性元素。 这是我的代码。 它总是抛出异常,因为我在propOrder中只定义了一个属性。但是由于属性是多重的,可能是一个或多个,我不知道如何实现它。或者你知道其他排序元素的方法吗 提

  • 问题内容: 假设我有以下java类,它映射到我的REST服务的请求主体以搜索用户。 注意 @XmlType* 批注的 propOrder 参数-它声明表示单个属性在XML文件中出现的顺序无关紧要,因此在生成的XSD模式中应使用 xsd:all 而不是 xsd:sequence 。 * 但是,如您所见,属性之一( 角色 属性)是一个列表,因此对应于具有 无界maxOccurs 的元素。 似乎在 xs

  • 问题内容: 我是AngularJS的新手。我了解到可以使用以下查询在DOM中找到元素: 这对于按ID或CSS类名查找元素很有用。但是,我需要能够使用其他方法来查找元素。我有一个看起来像下面的元素: 我无法查询“ myContainer”,因为它已被重用了多少。因此,我想找到任何具有“ my- directive”属性的元素。如何搜索DOM并找到任何使用“我的指令”的元素? 问题答案: 您应该在指令

  • 我试图找到一个没有属性的元素的XPath。它只能通过其父级的属性来识别。然而,父级也不具有唯一属性。 例如: 这里有两个元素。如何获得第二个元素。上面的语法为我提供了第一个元素。。但是,如果我使用: 我得到一个错误消息"xpath表达式 '//*[@id="btn"][2]/ul/li[2]/a/span'无法计算或不会导致WebElement"

  • 采用这种方法: 我不会写: 因为它似乎依赖于访问器方法被命名为。是否可以使用代替?

  • 我有以下JAXB对象: 我使用JAXB编组程序将对象转换为XML: 它运行平稳,没有任何异常,但是,结果总是缺少元素键。我试图将其改为Attribute,但它也不起作用。以下是输出示例: 我曾尝试将键更改为另一个名称,例如AuthKey,但它仍然缺失。我做错了什么? 编辑我发现了问题,这是因为我的键的值是空的。如果它包含值,则将其写入XML。然而,您能解释一下为什么在XMLElement中,我写了