Как мне получить соответствующую информацию из выходных данных JSON?

#java #json #xml #parsing

#java #json #xml #Синтаксический анализ

Вопрос:

Я пытаюсь разобрать XML-файл в JSON. Хотя я могу успешно выполнить синтаксический анализ с использованием HashMap, используемый мной XML-файл содержит много нерелевантной информации, которая также отражается в JSON.

Мой XML-файл представляет собой файл топологии, в основном топологии для сетевых элементов и их соответствующих процессов. Итак, он разделен на родительский и дочерний узлы. Большая часть необходимой информации, которую я ищу, относится к родительским узлам, и я хочу любыми способами игнорировать дочерние узлы, чтобы в JSON были доступны только родительские узлы.

Вот код, который я написал для синтаксического анализа. Я пытался написать код для получения дочерних enter code here узлов, но я не могу понять, как их удалить (например, какие условия я могу использовать):

 static String nodeType1,nodeType;
    static String nodeName1,nodeName;
    static String nodeIP1,nodeIP;

    public static void main(String[] args) {

        try { File fXmlFile = new File("SystemTopology.txt");
          DocumentBuilderFactory dbFactory = 
          DocumentBuilderFactory.newInstance();
          DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
          Document doc = dBuilder.parse(fXmlFile);

          doc.getDocumentElement().normalize();

          NodeList nList = doc.getElementsByTagName("SNOSNE") ;
          Map<String, Object> data = new HashMap<String, Object>();

          for (int temp = 0; temp < nList.getLength(); temp  ) {
              Node nNode = nList.item(temp);

              Element el = (Element) nNode;

              nodeType = el.getAttribute("snostype");
              nodeName = el.getAttribute("cimname");
              nodeIP = el.getAttribute("snoshostip");

              NodeList list = el.getChildNodes();

          for (int i = 0; i < list.getLength(); i  ) {
                  Node nNode1 = list.item(i);
           if(list.item(i).getNodeType() == Node.ELEMENT_NODE){
             Element element = (Element) list.item(i);
             nodeType1 = element.getAttribute("snostype");
             nodeName1 = element.getAttribute("cimname");
         nodeIP1 = element.getAttribute("snoshostip");
                if(!nodeIP1.isEmpty()) {
                      System.out.println(nodeType1);
                      System.out.println(nodeName1);
                      System.out.println(nodeIP1);
                        }
                  } 
              }
         //Need to add conditions here that would get only child nodes    
                  if(!nodeIP.isEmpty()) {
                      data.put(nodeName, nodeType "," nodeIP);
                  }
          }
          JSONObject json = new JSONObject(data);
          System.out.printf( "JSON: %s", json.toString(2));
    }
        catch (Exception excp)
        {
          System.out.println("topology file not found "   excp.getMessage());
        }
  

Файл топологии выглядит следующим образом:

     <SNOSNE cimname="EDA_01" snoshostip="1.1.1.1" snostype="EDA">
         <SNOSNE cimname="Resources" snoshostip="1.1.1.1" snostype="EDA">
         </SNOSNE>
         <SNOSNE cimname="CPU" snoshostip="1.1.1.1" snostype="EDA">
         </SNOSNE>
    ...
    ...
    ...
    </SNOSNE>
  

Ожидаемый вывод должен содержать только родительский файл с cimname =»EDA_01″. И все дочерние узлы должны быть проигнорированы в выводе JSON.

Комментарии:

1. Вы могли бы использовать XPath и / или XSLT для фильтрации интересующих вас элементов, в XSLT 3 (поддерживаемом для Java Saxon 9.8 и 9.9 HE с открытым исходным кодом) вы даже можете напрямую сконструировать JSON (см. xqueryfiddle. liberty-development.net/6qM2e2i где array { //SNOSNE[@cimname = 'EDA_01']!map { @cimname : @snostype || ',' || @snoshostip } } используется чистый XPath 3.1 в XQuery 3.1 только для определения правильной сериализации. Возможно, вам потребуется немного подробнее объяснить, как выглядит ваш XML и какой JSON вы хотите создать.

2. На самом деле, единственное, что мне нужно сделать, это определить условие, которое будет применено к snoshostip, чтобы сделать его таким, чтобы, если оно встречается один раз в родительском узле, оно должно пропускать дочерние узлы, потому что у них был бы тот же snoshostip, что и у родительского. Я попытался поместить ключ hashmap в качестве snoshostip, но это сканирует XML и выдает последний экземпляр snoshostip в JSON. Я хочу обратного, если snoshostip найден на родительском, он пропускает дочерние узлы и переходит к следующему родительскому.

3. XPath (даже версии 1.0) может выразить ваше требование, например, //SNOSNE[@snoshostip and not ancestor::SNOSNE/@snoshostip] поэтому использование XPath может помочь вам перейти только к тем элементам, которые вы ищете.