将XML解析为对象Java

时间:2019-11-29 11:57:35

标签: java jackson

我有这个 xml

<Link ID="6" Name="ALM_JIRA_BUG_2POSICIONGL">
 <Endpoint ordinal="1">
            <type>Micro-Focus-ALM</type>
            <epName>Micro-Focus-ALM</epName>
            <entityName>Defect</entityName>
            <entityType>DEFECT</entityType>
            <ConnectionData>
                <username>sa_aplservmercury</username>
                <password encryptInitString="p2yY5PjzSJs/pn5Kmzz/TQ=="
                    encrypted="true" value="Iwxz/rPt9elfoFxWSqnvfw=="/>
        <Properties>
                    <property name="ServerURL" value="http://alm3.produban.gs.corp/qcbin"/>
                    <property name="Domain" value="QAF_SAN_AGILE"/>
                    <property name="Project" value="PG_ADN360"/>
                </Properties>

            </ConnectionData>

            </Filters>
            <Params/>
        </Endpoint>
</Link>

这些解析类

@Data
public class PropertyXml {

    @JacksonXmlProperty(isAttribute = false, localName = "property")
    private String property;

    @JacksonXmlProperty(isAttribute = true, localName = "name")
    private String name;

    @JacksonXmlProperty(isAttribute = true, localName = "value")
    private String value;

}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Properties {

    @JacksonXmlProperty(isAttribute = false, localName = "Properties")
    @JacksonXmlElementWrapper(useWrapping = false)
    List<PropertyXml> properties = new ArrayList<>();
}

@JacksonXmlRootElement(localName = "ConnectionData")
public class ConnectionData {

    @JacksonXmlProperty(localName = "username")
    private String userName;

    @JacksonXmlProperty(localName = "password")
    private Password password;

    @JacksonXmlProperty(localName = "Properties")
    private Properties properties;

}

@JacksonXmlRootElement(localName = "ConnectionData")
public class ConnectionData {

    @JacksonXmlProperty(localName = "username")
    private String userName;

    @JacksonXmlProperty(localName = "password")
    private Password password;

    @JacksonXmlProperty(localName = "Properties")
    private Properties properties;

}


public class Endpoint {

    @JacksonXmlProperty(isAttribute = true, localName = "ordinal")
    private String ordinal;

    @JacksonXmlProperty(isAttribute = false, localName = "type")
    private String type;

    @JacksonXmlProperty(isAttribute = false, localName = "epName")
    private String epName;

    @JacksonXmlProperty(isAttribute = false, localName = "entityName")
    private String entityName;

    @JacksonXmlProperty(isAttribute = false, localName = "entityType")
    private String entityType;

    @JacksonXmlProperty(isAttribute = false, localName = "ConnectionData")
    private ConnectionData connectionData;

    @JacksonXmlProperty(isAttribute = false, localName = "Filters")
    private String filters;

    @JacksonXmlProperty(isAttribute = false, localName = "Params")
    private String params;

}

public class Link {

    @JacksonXmlProperty(isAttribute = true, localName = "ID")
    private String id;

    @JacksonXmlProperty(isAttribute = true, localName = "Name")
    private String name;

    @JacksonXmlProperty(isAttribute = false, localName = "Endpoint")
    private Endpoint endpoint;
}

A través de este código leo el fichero y hago la deserialización:

服务等级:

@Service
public class ConvertToXmlJsonImpl implements ConvertToXmlJsonService {

    public void convertFromXmlFile() {
        File file = new File("C:/incremental.xml");
        XmlMapper xmlMapper = new XmlMapper();
        Link value = null;
        //ConvertToXmlJsonModel value = null;
        String xml = null;
        try {
            xml = inputStreamToString(new FileInputStream(file));
            //value = xmlMapper.readValue(xml, ConvertToXmlJsonModel.class);
            value = xmlMapper.readValue(xml, Link.class);
            System.out.print(value);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //return value;
    }

    private String inputStreamToString(FileInputStream fileInputStream) throws IOException {

        StringBuilder sb = new StringBuilder();
        String line;
        BufferedReader br = new BufferedReader(new InputStreamReader(fileInputStream));
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        br.close();
        return sb.toString();
    }

制作映射器时返回例外

  

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:   无法识别的字段“名称”(类   com.example.convertToXmlJson.model.Properties),未标记为   可忽略的(一个已知属性:“属性”]),位于[来源:   (StringReader);行:1,列:567](通过参考链:   com.example.convertToXmlJson.model.Link [“端点”]-> com.example.convertToXmlJson.model.Endpoint [“ ConnectionData”]-> com.example.convertToXmlJson.model.ConnectionData [“属性”]-> java。 util.ArrayList [0]-> com.example.convertToXmlJson.model.Properties [“ name”])

1 个答案:

答案 0 :(得分:1)

关于您的代码,有两个问题:

1)xml格式不正确,标签过滤器没有开头标签:

<Link ID="6" Name="ALM_JIRA_BUG_2POSICIONGL">
 <Endpoint ordinal="1">
            <type>Micro-Focus-ALM</type>
            <epName>Micro-Focus-ALM</epName>
            <entityName>Defect</entityName>
            <entityType>DEFECT</entityType>
            <ConnectionData>
                <username>sa_aplservmercury</username>
                <password encryptInitString="p2yY5PjzSJs/pn5Kmzz/TQ=="
                    encrypted="true" value="Iwxz/rPt9elfoFxWSqnvfw=="/>
        <Properties>
                    <property name="ServerURL" value="http://alm3.produban.gs.corp/qcbin"/>
                    <property name="Domain" value="QAF_SAN_AGILE"/>
                    <property name="Project" value="PG_ADN360"/>
                </Properties>

            </ConnectionData>

            </Filters> <!-- there is no oppening tag for this one-->
            <Params/>
        </Endpoint>
</Link>

2)属性映射应按以下方式更正:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Properties {

    @JacksonXmlProperty(isAttribute = false, localName = "property")
    @JacksonXmlElementWrapper(useWrapping = false)
    List<PropertyXml> properties = new ArrayList<>();
}
相关问题