Ведение подсчета элементов XML с использованием Xpath - PullRequest
0 голосов
/ 12 октября 2019

Я новичок в использовании Java-программирования, особенно использующего Xpath для анализа XML-файла. Я пытаюсь разработать систему маршрутизации полетов в соответствии с их весом. Я хочу:

Поддерживать количество рейсов для каждого местоположения;Система должна принять местоположение и вернуть номер и страну, в которую следует направить рейс. Для каждых 4 рейсов в Японию проложите следующие 2 рейса в Китай, затем проложите следующие 2 рейса в Индию и выполните цикл и укажите счет, континент, название места, страну и вес.

Буду признателен за любую помощь, пожалуйста.

Я могу передать данные XML и получить различные узлы элементов с помощью Xpath. Я попытался использовать SAX и STAX, но предпочел этот метод, поскольку он был понятен и лаконичен при построении выражений.

Пример файла XML:

<continent>
    <location name = "asia">
              <country>Japan</country>
              <code>0000011111</code>
              <weight>10</weight>
      </location>
      <location name = "asia">
              <country>China</country>
              <code>0000022222</code>
              <weight>1</weight>
      </location>
</continent>

JavaПример кода:

public static void main(String[] args) {

try {
  FileInputStream file = new FileInputStream(new File("c:/continents.xml"));

  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

  DocumentBuilder builder =  builderFactory.newDocumentBuilder();

  Document xmlDocument = builder.parse(file);

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

  System.out.println("*************************");
  String expression = "/continent/location";
  System.out.println(expression);
  String name = xPath.compile(expression).evaluate(xmlDocument);
  System.out.println(name);

  System.out.println("**********Parse XML File***************");
  expression = "/continent/location/country|//number|//weight";
  System.out.println(expression);
  NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
  for (int i = 0; i < nodeList.getLength(); i++) {
      System.out.println(nodeList.item(i).getFirstChild().getNodeValue()); 
  }

  System.out.println("*************************");
  expression = "/continent/location[@name='asia']/number";
  System.out.println(expression);
  nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
  for (int i = 0; i < nodeList.getLength(); i++) {
      System.out.println(nodeList.item(i).getFirstChild().getNodeValue()); 
  }

  System.out.println("*************************");
  expression = "//location[country='China']";
  System.out.println(expression);
  Node node = (Node) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);
  if(null != node) {
    nodeList = node.getChildNodes();
    for (int i = 0;null!=nodeList && i < nodeList.getLength(); i++) {
      Node nod = nodeList.item(i);
      if(nod.getNodeType() == Node.ELEMENT_NODE)
        System.out.println(nodeList.item(i).getNodeName() + " : " + nod.getFirstChild().getNodeValue()); 
    }
  }
}

1 Ответ

0 голосов
/ 12 октября 2019

Я не уверен, что понимаю вашу цель, но если вы просто хотите посчитать, сколько рейсов в конкретную страну, вы можете сосчитать соответствующие элементы:

NodeList matches = (NodeList) xPath.evaluate(
    "//country[text()='" + country + "']",
    xmlDocument,
    XPathConstants.NODESET);

int matchCount = matches.getLength();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...