2016-10-10 4 views
1

Ich benutze Java, und ich brauche Informationen aus einer AutomationML-Datei (XML-Typ-Datei). Ich versuche, JAXB zu benutzen, aber am Ende kann ich nicht die Informationen bekommen, die ich brauche. In AML habe ich eine InstanceHierarchy mit 3 InternalElements mit einigen Attributen, und ich brauche diese Attribute Werte, aber mit JAXB bekomme ich den AttributName, aber ich kann seinen Wert nicht erhalten.Parsing XML-Datei

public static void main(String[] args) throws Exception { 

    CAEXFile caex = null; 
    CAEXFile.InstanceHierarchy ih = null; 
    try { 

     JAXBContext jc = JAXBContext.newInstance(CAEXFile.class); 
     //JAXBContext jc = JAXBContext.newInstance(generated.CAEXFile.InstanceHierarchy.class); 
     Unmarshaller ums = jc.createUnmarshaller(); 
     CAEXFile aml = (CAEXFile)ums.unmarshal(new File("src\\teste2.aml")); 

     System.out.println("ins = " + aml.getInstanceHierarchy().get(0).getInternalElement().get(0).getAttribute().get(0).getName()); 

    } catch (JAXBException e) { 
    System.out.println(e.getMessage()); 
    } 
} 

die XSD-Datei XSD (CAEX) und AML-Datei AML Kann mir jemand helfen JAXB verwenden oder einige Richtungen geben Sie mir, wie diese zu lösen? Vielen Dank im Voraus.

Antwort

1

Sie können tatsächlich JAXB ganz vermeiden, was abhängig vom Rest Ihres Codes nützlich sein kann. Wenn Sie Java 8 vielleicht Dynamics verwenden, wäre eine nette & direkte Lösung.

XmlDynamic example = new XmlDynamic(xmlStringOrReaderOrInputSourceEtc); 

String firstInternalName = example.get("CAEXFile|InstanceHierarchy|InternalElement|@Name").asString(); 
// TestProduct_1 

List<String> allInternalNames = example.get("CAEXFile").children() 
    .filter(hasElementName("InstanceHierarchy")) // import static alexh.weak.XmlDynamic.hasElementName; 
    .flatMap(Dynamic::children) 
    .filter(hasElementName("InternalElement")) 
    .map(internalElement -> internalElement.get("@Name").asString()) 
    .collect(toList()); 
// [TestProduct_1, TestResource_1, TestProduct_2, TestProduct_3, TestResource_2] 

Es ist eine einzige und leichte zusätzliche Abhängigkeit, dh in Maven:

<dependency> 
    <groupId>com.github.alexheretic</groupId> 
    <artifactId>dynamics</artifactId> 
    <version>2.3</version> 
</dependency> 
+0

Danke für die Antwort, ich mit Doppel unmarshall gelöst;) –