dom4J: как получить атрибуты, элементы и применить XPath на Node? - PullRequest
0 голосов
/ 13 октября 2011

Я читаю XML, используя dom4j, используя методы XPath для выбора нужных узлов.Учтите, что мой XML выглядит следующим образом:

<Emp_Dir>
    <Emp_Classification type ="Permanent" >
        <Emp id= "1">
        <name>jame</name>
            <Emp_Bio>
                <age>12</age>
                <height>5.4</height>
        <weight>78</weight>
            </Emp_Bio>
            <Empployment_History>
        <job>
            <salary>2000</salary>
            <designation>senior developer</designation>
            <duration>2years</duration>
        </job>
        <job>
            <salary>1000</salary>
            <designation>developer</designation>
            <duration>3years</duration>
        </job>                
            </Empployment_History>
        </Emp>
    .
    .
    .
    </Emp_Classification>

    <Emp_Classification type ="Contract" >
    .
    .
    .
    </Emp_Classification>

    <Emp_Classification type ="PartTime" >
    .
    .
    .
    </Emp_Classification>
</Emp_Dir>

Примечание. Приведенный выше XML может показаться вам уродливым, но я создаю этот фиктивный файл только для понимания и сохранения секретности моего проекта

Моя желаемая цель - получить историю занятости каждого постоянного сотрудника, для этого мне удалось получить все узлы «Emp» постоянных сотрудников, используя следующую XPath Epression:

//Emp_Dir/Emp_Classification[@type='Permanent']/Emp

Код, который получаети хранить узлы выглядит следующим образом:

List<? extends Node> lstprmntEmps = document.selectNodes("//Emp_Dir/Emp_Classification/[@type='Permanent']/Emp");
ArrayList<Employee> Employees = new ArrayList<Employee>();//Employee is my custom class
for (Node node : lstprmntEmps)
{  
Employees.add(ParseEmployee(node));//ParseEmployee(. . .) is my custom function that pareses emp XML and return Employee object
}

Теперь я хочу задать следующие три вопроса:

  1. Как получить атрибут ID каждого сотрудника?
  2. Как мне получить элемент имени каждого сотрудника?
  3. Последний, но самый важный вопрос: какой XPath мне нужно указать, чтобы получить узел Job каждого сотрудника?Я попытался выполнить следующее, но безуспешно: (

node.selectNodes ("/ Emp / Empployment_History / job"); // это возвращает ноль узлов (или) node.selectNodes ("// Emp/ Empployment_History / job "); // это возвращает больше ожидаемых узлов

1 Ответ

1 голос
/ 31 января 2012

Если я правильно понимаю, когда вы говорите "Узел задания каждого сотрудника", вы не ищете XPath, который возвращает все узлы задания в файле XML - скорее, вы намереваетесь реализовать метод ParseEmployee и извлекать из документа список заданий для одного данного сотрудника (идентифицируемый переданным узлом XML)?

Это может быть реализовано примерно так (исключая часть, где вы действительно делаете что-то полезное с извлеченными строками, и пропуская нулевые проверки и такие, которые вы захотите включить!)

public parseEmployee (Element e) {
   String id = e.attributeValue("id");
   String name = e.elements("name").get(0).getText();
   List<Element> jobs = e.elements("job");
   for (Element job : jobs) {
       parseJob(job);
   }
}

parseJob() будет работать по аналогичным принципам и извлекать соответствующую информацию из переданного ему элемента <job>.

...