【问题标题】:XML parser (Unmarshall) using JaxB to get elemet from xml fileXML解析器(Unmarshal)使用JaxB从xml文件中获取元素
【发布时间】:2021-11-20 17:04:36
【问题描述】:

我是 jaxB XML 解析器的新手。我需要从元素标记中获取所有属性(idref、类型、名称、范围)** 我尝试了一些东西但得到了错误。

XML 文件

<?xml version="1.0" encoding="windows-1252"?>
    <xmi:XMIxmi:version="2.1"xmlns:uml="http://www.omg.org/spec/UML/20090901"xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:thecustomprofile="http://www.sparxsystems.com/profiles/thecustomprofile/1.0" xmlns:SysML="http://www.omg.org/spec/SysML/20161101/SysML">
        <xmi:Documentation exporter="Enterprise Architect" exporterVersion="6.5" exporterID="1555"/>
            <xmi:Extension extender="Enterprise Architect" extenderID="6.5">
                <elements>
      <element xmi:idref="EAPK_5560E5AF_736A_4703_AC79_CA3FAA60984B" xmi:type="uml:Package" name="PackageView" scope="public"></element>
                    <element xmi:idref="EAPK_59058493_9220_4b05_888A_67C6854C97EC" xmi:type="uml:Package" name="Read from Communication Interface" scope="public">  
                    </element>
                    <element xmi:idref="EAID_870B8E54_0FF2_4a90_A9C1_23F477DF695F" xmi:type="uml:Activity" name="Read from communication interface" scope="public">
                    </element>
                </elements>
            </xmi:Extension>
        </xmi:XMI>

主类

public class XmlElement {
        
          public static void main(String[] args) {
        
            JAXBContext jaxbContext;
            String fileLocation = "C:\\vinoth\\XML_JaxbParser\\elements.xml";
            try (FileInputStream fileInputStream = new FileInputStream(fileLocation)) {
                System.out.println("******** PARSING START ********");
                jaxbContext = JAXBContext.newInstance(Xmi.class);
                Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
                elements elements = (elements) unmarshaller.unmarshal(fileInputStream);
                System.out.println(elements);
                System.out.println("******** PARSING DONE ********");
            } catch (Exception e) {
                System.out.println("******** ERROR: SOMETHING WENT WRONG ********");
                e.printStackTrace();
            }
        }
        }

elements.java

@XmlRootElement(name = "xmi")
    
        @XmlAccessorType(XmlAccessType.FIELD)
    
        public class Elements {
         @XmlElement(name = "elements")
          private List<Elements> elements;
          // Generate Getters and Setters...
          @Override
          public String toString() {
            return "Elements [elements="+ elements +"]";
          }
        }

element.java

@XmlAccessorType(XmlAccessType.FIELD)
        public class Element {
          @XmlAttribute(name = "idref")
          private String idref;
          @XmlAttribute(name = "type")
          private String type;
          @XmlAttribute(name = "name")
          private String name;
          @XmlAttribute(name = "scope")
          private String scope;
        //Generate Getters and Setters...
          @Override
          public String toString() {
            return "Element [idref=" + idref + ",type=" + type + ", name=" + name + ", scope=" + scope+ "]";
          }
        
        }

我需要从给定的 XML 文件中获取元素属性。我不知道我在哪里做错了。根元素和父子元素,我可以从映射部分理解错误。但我无法解决。

【问题讨论】:

  • 错误通常会告诉你哪里出了问题。不在您的问题中包含它会使其他人更难解决问题。
  • XML 中元素名称和属性之间缺少一些空格。我不知道这是您真正的 XML 代码,还是只是此处的不准确复制和粘贴。

标签: java xml xml-parsing jaxb unmarshalling


【解决方案1】:

您的 XML 文件使用了许多不同的XML namespaces, 您需要在 Java 代码中考虑。

特别注意,命名空间 URIs(例如 "http://schema.omg.org/spec/XMI/2.1") 是 唯一相关的事情。命名空间前缀(例如xmi:)不是 与Java相关。它们只是为了制作 XML 而发明的 更易于人类阅读。

我建议将所有 XML 命名空间 URI 定义为 Java 字符串内容以避免在代码中多次输入:

public class NameSpaces {
    public final static String UML = "http://www.omg.org/spec/UML/20090901";
    public final static String XMI = "http://schema.omg.org/spec/XMI/2.1";
    public final static String THE_CUSTOM_PROFILE = "http://www.sparxsystems.com/profiles/thecustomprofile/1.0";
    public final static String SYSML = "http://www.omg.org/spec/SysML/20161101/SysML";
}

您需要仔细查看您的 XML 内容(XML 元素 XMIDocumentationExtensionElementsElement 和 它们的 XML 属性)查看哪个 XML 命名空间在哪里使用。 然后在 all 您的 Java 类中,您需要指定正确的 @XmlAttribute@XmlElement 注释中的命名空间。 您还需要在 @XmlRootElement 中指定命名空间 您的根类的注释。 另请参阅Javadoc of the JAXB annotations

我不会为你做所有的工作,而只是展示如何 你的根类和Element 类可能看起来像。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "XMI", namespace = NameSpaces.XMI)
public class XMI {

    @XmlAttribute(name = "version", namespace = NameSpaces.XMI)
    private String version;

    @XmlElement(name = "Documentation", namespace = NameSpaces.XMI)
    private Documentation documentation;

    @XmlElement(name = "Extension", namespace = NameSpaces.XMI)
    private Extension extension;

    // Getters, setters, toString omitted here for brevity
}
@XmlAccessorType(XmlAccessType.FIELD)
public class Element {

    @XmlAttribute(name = "idref", namespace = NameSpaces.XMI)
    private String idref;

    @XmlAttribute(name = "type", namespace = NameSpaces.XMI)
    private String type;

    @XmlAttribute(name = "name")
    private String name;

    @XmlAttribute(name = "scope")
    private String scope;

    // Getters, setters, toString omitted here for brevity
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多