【问题标题】:unmarshal xml without schema解组没有架构的 xml
【发布时间】:2015-02-23 17:40:52
【问题描述】:

我正在使用 JAXB 将 xml 转换为对象。我正在手动创建类,因为 WS 供应商没有为我们提供模式。

XML 是:-

<com:DayAndTimeAvailability>
    <com:DayTypes>
        <com:MondayToSunday />
    </com:DayTypes>
    <com:OpeningHours>
        <com:TwentyFourHours />
    </com:OpeningHours>
</com:DayAndTimeAvailability>

我对“DayTypes”元素感到困惑。它可以有值 &lt;com:MondayToFriday/&gt;,&lt;com:Weekend/&gt;,&lt;com:MondayToSunday/&gt;, &lt;com:Monday/&gt;,&lt;com:Tuesday/&gt;, &lt;com:Wednesday/&gt;,&lt;com:Thursday/&gt;, &lt;com:Friday/&gt;,&lt;com:Saturday/&gt;, &lt;com:Sunday/&gt;。 我想要一个字符串变量,它的值基于上面提到的元素。就像我在 xml 中得到 &lt;com:MondayToFriday/&gt; 一样,那么我需要将值 Monday - Friday 24 Hours a Day 保存在一个字符串中。

谁能帮帮我?

【问题讨论】:

  • 这里是一个完整的例子,展示了如何做到这一点:blog.bdoughan.com/2010/12/…
  • 谢谢布莱斯·道恩。我也在寻找同样的东西。我也可以像我在下面给出的答案那样做。
  • 嗨 Blaise Doughan,我试过了,但每次我在解组时都为空。未调用适配器的 unmarshal 方法。
  • 您是否按照我发布的方式尝试了我的示例。你映射命名空间了吗?见blog.bdoughan.com/2010/08/jaxb-namespaces.html
  • 我在根元素类中映射命名空间。我应该在 Adaptor 中处理命名空间吗?

标签: java xml jaxb schema


【解决方案1】:

如果您有 xml,则无需手动创建类。 为这个 xml 创建 xsd,然后使用 xjc 命令可以生成 POJO。 要将您的 xml 映射到对象,请使用此方法,

    JAXBContext context = JAXBContext.newInstance(YourMainClass.class);
            Unmarshaller u = context.createUnmarshaller();
            yourMainClassObject= (YourMainClass) u.unmarshal(new StringReader(xml));

【讨论】:

    【解决方案2】:

    我喜欢这个

    @XmlRootElement(name="DayTypes")
        public static class DayTypes{
            private ElementNSImpl element;
            private String value;
    
            @XmlAnyElement
            public ElementNSImpl getElement() {
                return element;
            }
            public void setElement(ElementNSImpl element) {
                String nodeName = element.getNodeName();
                switch (nodeName) {
                case "com:MondayToSunday":
                    setValue("Monday - Sunday 24 Hours a Day");
                    break;
                case "com:MondayToFriday":
                    setValue("Monday - Friday 24 Hours a Day");
                    break;
                default:
                    setValue(nodeName);
                    break;
                }
                this.element = element;
            }
    
            @XmlTransient
            public String getValue() {
                return value;
            }
            public void setValue(String value) {
                this.value = value;
            }
        }
    

    但我不知道这是否正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2020-07-13
      • 2011-10-06
      • 1970-01-01
      相关资源
      最近更新 更多