使用xPath从xml文件创建Java对象

使用xPath从xml文件创建Java对象,java,xml,xpath,Java,Xml,Xpath,我有一个以下格式的xml文件: <Employee> <EmployeeID>10</EmployeeID> <Name>David</Name> <Department>Service</Department> </Employee> } 这是我到目前为止所拥有的。我似乎不知道如何最好地检索我需要的所有信息并创建对象: public void parseFile(Strin

我有一个以下格式的xml文件:

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

这是我到目前为止所拥有的。我似乎不知道如何最好地检索我需要的所有信息并创建对象:

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;
}
public void解析文件(字符串文件名){
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
DocumentBuilder=null;
单据=空;
试一试{
builder=factory.newDocumentBuilder();
document=builder.parse(新文件(文件名));
XPathFactory XPathFactory=XPathFactory.newInstance();
XPath=xPathFactory.newXPath();
List employees=getEmployeesFromXml(文档,xPath);
}捕获(SAXE异常){
e、 printStackTrace();
}捕获(ParserConfiguration异常e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有列表getEmployeesFromXml(文档,XPath){
列表=新的ArrayList();
试一试{
//创建从xml检索值的表达式
}捕获(XPathExpressionException e){
e、 printStackTrace();
}
返回null;
}

如果您不想解析XML并对节点执行某些操作,请仅将它们转换为Java对象,我建议您看一下。这是一个很好的框架,可以加载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();
}

如果您不想解析XML,也不想对节点做些什么,只需要将它们转换为Java对象,我建议您看一看。这是一个很好的框架,可以加载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();
}

不能使用xPath解析XML文件。xPath是一种查询语言,用于选择现有加载的XML文档(DOM)中的节点。不能使用xPath解析XML文件。xPath是一种查询语言,用于选择现有加载的XML文档(DOM)中的节点。这似乎是一个不错的工具。是否可以在列表中收集结果?在我的例子中,我可以说:List employees=new XBprojector().io().stream(新文件(“employee.xml”).read(EmployeeInterface.class)例如?当然你也可以这样做。就像在这个例子中,你可以得到
SkillSet
s的列表一样。但是我建议你参考文档。有很多例子。我会看更多的文档,谢谢!:)这似乎是一个很好的工具。是否可以在列表中收集结果?在我的例子中,我可以说:List employees=new XBprojector().io().stream(新文件(“employee.xml”).read(EmployeeInterface.class)例如?当然你也可以这样做。就像在示例中,你可以获得
SkillSet
s的列表一样。但是我建议你参考文档。这里有很多示例。我将查看更多文档,谢谢!)
ProfileData profileData = new XBProjector().io().stream(yourXMLFileStream).read(ProfileData.class);