【问题标题】:Create Java object from xml file with xPath使用 xPath 从 xml 文件创建 Java 对象
【发布时间】:2016-04-14 11:00:03
【问题描述】:

我有一个这种格式的 xml 文件:

<Employee>
    <EmployeeID>10</EmployeeID>
    <Name>David</Name>
    <Department>Service</Department>
</Employee>

我有一个大的 xml 文件,它只包含这种格式的员工。我想要的是使用 xPath 从文件中选择节点,然后为每个条目创建一个 Java 对象:

public class Employee {

String name; 
String department; 
int age; 

public int getAge() {
    return age; 
}

public void setAge(int age) {
    this.age = age; 
}

public String getName() {
    return name; 
}

public void setName(String name) {
    this.name = name; 
}

public String getDepartment() {
    return department; 
}

public void setDepartment(String department) {
    this.department = department; 
}

}

这是我目前所拥有的。我似乎无法弄清楚如何最好地检索我需要的所有信息,并创建对象:

public void parseFile(String fileName) {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = null;
    Document document = null;

    try {
        builder = factory.newDocumentBuilder();
        document = builder.parse(new File(fileName));

        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();

        List<Employee> employees = getEmployeesFromXml(document, xPath); 

    } catch (SAXException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private List<Employee> getEmployeesFromXml(Document document, XPath xPath) {

    List<Employee> list = new ArrayList<Employee>();

    try {
        // Create an expression that retrieves the values from xml 
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }

    return null;
}

【问题讨论】:

  • 您无法使用 xPath 解析 XML 文件。 xPath 是一种查询语言,可在现有加载的 XML 文档 (DOM) 中选择节点。

标签: java xml xpath


【解决方案1】:

如果您不想解析 XML 并且不想对节点执行某些操作,只需将它们转换为 Java 对象,我建议您查看 XMLBeam。这是一个很好的框架,可以加载您的 XML 文件并根据您为每个元素定义的 XPath 创建投影。

例如,投影是这样的:

public interface ProfileData {
    @XBRead("/root/personal_data/resultSet/firstname")
    String getFirstName();
    @XBRead("/root/personal_data/resultSet/surname")
    String getSurname();

    @XBRead("/root/personal_data/resultSet/core_areas")
    String getCoreAreas();

    interface Skill {
        @XBRead("skillname")
        String getName();
        @XBRead("skillval")
        String getExperience();
    }
    interface SkillSet {
        @XBRead("../gencatname")
        String getGenericCategory();
        @XBRead("catname")
        String getCategory();
        @XBRead("skill")
        List<Skill> getSkills();
    }

    @XBRead("/root/skills/tab/category")
    List<SkillSet> getSkillSets();
}

@XBRead 注释定义了收集元素的 XPath。

要提取信息,您可以像这样调用 XMLBeam:

ProfileData profileData = new XBProjector().io().stream(yourXMLFileStream).read(ProfileData.class);

【讨论】:

  • 这似乎是一个不错的工具。是否可以在列表中收集结果?在我的情况下,我可以说: List employees = new XBprojector().io().stream(new File("employee.xml").read(EmployeeInterface.class) 例如?
  • 当然你也可以这样做。就像在示例中您可以获得SkillSets 的列表一样。不过我建议你参考文档。有很多例子。
  • 我会多看文档的,谢谢! :)
猜你喜欢
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
相关资源
最近更新 更多