2014-01-10 2 views
0

Я получил этот XML-файл, который не очень хорошо отформатированный, но мне нужно, чтобы разобрать этот anyhow.I попробовал все варианты разборе говорят DOM/SAX синтаксического анализа, но до сих пор не удалось достичь, Пробовал thisСинтаксический XML в Java

Так может ли кто-нибудь, пожалуйста, направить меня, как мне разобрать такие хорошо отформатированные XML-данные.

Вот XML-файл

<?xml version="1.0" ?> 
<Employee> 
<Name> Jack 
<EMPID> EMP001 <Address> 12 CA, USA</Address> 
</EMPID> 
</Name> 
</Employee> 

Синтаксический Код

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory 
        .newInstance(); 
      DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
      Document doc = docBuilder.parse(new File(
        "new.xml")); 

      // normalize text representation 
      doc.getDocumentElement().normalize(); 
      System.out.println("Root element of the doc is " 
        + doc.getDocumentElement().getNodeName()); 

      NodeList listOfPersons = doc.getElementsByTagName("NAME"); 
      int totalPersons = listOfPersons.getLength(); 


      for (int s = 0; s < listOfPersons.getLength(); s++) { 

       Node firstPersonNode = listOfPersons.item(s); 
       if (firstPersonNode.getNodeType() == Node.ELEMENT_NODE) { 

        Element firstPersonElement = (Element) firstPersonNode; 

        // ------- 
        NodeList firstNameList = firstPersonElement 
          .getElementsByTagName("Name"); 
        Element firstNameElement = (Element) firstNameList.item(0); 

        NodeList textFNList = firstNameElement.getChildNodes(); 
        System.out 
          .println("Name : " 
            + ((Node) textFNList.item(0)) 
              .getNodeValue().trim()); 

        // ------- 
        NodeList lastNameList = firstPersonElement 
          .getElementsByTagName("EMPID"); 
        Element lastNameElement = (Element) lastNameList.item(0); 

        NodeList textLNList = lastNameElement.getChildNodes(); 
        System.out 
          .println("ID : " 
            + ((Node) textLNList.item(0)) 
              .getNodeValue().trim()); 

        // ---- 
        NodeList ageList = firstPersonElement 
          .getElementsByTagName("Address"); 
        Element ageElement = (Element) ageList.item(0); 

        NodeList textAgeList = ageElement.getChildNodes(); 
        System.out.println("Address : " 
          + ((Node) textAgeList.item(0)).getNodeValue() 
            .trim()); 



       } 

      } 

     } catch (SAXParseException err) { 
      System.out.println("** Parsing error" + ", line " 
        + err.getLineNumber() + ", uri " + err.getSystemId()); 
      System.out.println(" " + err.getMessage()); 

     } catch (SAXException e) { 
      Exception x = e.getException(); 
      ((x == null) ? e : x).printStackTrace(); 

     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
+1

У вас неверный XML, поэтому я не думайте, что вы можете использовать стандартные парсеры Java XML для его анализа. –

+0

Невозможно проанализировать неформатированный XML-файл. Над XML не имеет надлежащего формата. Исправь это. Java API позаботится об этом. Не пишите еще один Java API для чтения неправильного XML. – AmitG

+0

Что значит «все варианты разбора»? Не могли бы вы объяснить немного больше о своем вопросе? – joragupra

ответ

2

Поскольку XML, само по себе сломанный XML синтаксический потерпит неудачу.

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

String str = "<?xml version=\"1.0\" ?>\n" + 
         "<Employee>\n" + 
         "<Name> Jack\n" + 
         "<EMPID> EMP001 <Address> 12 CA, USA</Address> \n" + 
         "</EMPID>\n" + 
         "</Name>\n" + 
         "</Employee>"; 
     str = str.replaceAll("\\n", ""); 
     Pattern p = Pattern.compile("<Name>(.+?)<EMPID>(.+?)<Address>(.+?)</Address>"); 
     Matcher m = p.matcher(str); 
     while(m.find()) 
     { 
      System.out.println("Name: " + m.group(1) + " EMPID: " + m.group(2) + " Address: " + m.group(3)); 
     } 

Урожайность:

Имя: Jack EmpId: EMP001 Адрес: 12 CA, USA

Что делает эту модель сделать:

  • <Name> будет соответствовать Name тег.
  • (.+?) будет соответствовать тому, что текст следует <Name> тега, но остановится соответствующим момент он находит <EMPID>, так как это не жадный узор из-за ? добавленные после жадного оператора + (это будет сопровождаться следующей секцией шаблон. Также в этом разделе, все что соответствует будет помещен в группу, которая может быть позже доступ.
  • После того, что имя извлекается, двигатель будет пытаться соответствовать <EMPID> тег.
  • После этого <EMPID> тега будет выполняться процесс, аналогичный шагу 2, и соответствующий контент будет помещен в другую группу.
  • Что касается следующего шага, код будет выглядеть для <Address>
  • Наконец, регулярное выражение будет пытаться извлечь любые символы, которые в период между <Address> и </Address> тегов и еще раз, все, что матчи будут размещены в группа.

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

Вводный учебник по регулярным выражениям можно найти here.

+0

Как получить команду над шаблонами? Можете ли вы предложить какую-либо ссылку для изучения или любую книгу? – AmitG

+1

@AmitG: Я улучшил свой ответ, надеюсь, он прольет еще немного света по этому вопросу. – npinti

+1

@npinti Этот ответ дал мне большую надежду. Благодарю. Теперь мне нужно поместить этот XML в такой формат String, как «str» – user1432151

1

Попробуйте проанализировать XML после его исправления. Хорошо отформатированный XML имеет только 1 значение на XML-элемент, но может иметь несколько атрибутов:

<employee attribute="attrvalue">value-string or xml-element, not both</employee> 

Так предложение о том, как ваш XML должен выглядеть будет выглядеть следующим образом:

<?xml version="1.0" ?> 
<Employee> 
    <Name> Jack </Name> 
    <EMPID> EMP001 </EMPID> 
    <Address> 12 CA, USA</Address> 
</Employee> 

EDIT : Однако, если вы получаете XML из источника, который вы не можете изменить, то для вас остается только один вариант - вручную разбор XML после преобразования его в обычную строку Java.

Попытка использовать различные строковые-методы, такие как подстроки, IndexOf т.д. Пример:

String empidStartElement = "<empid>"; 
String nameStartElement = "<name>"; 
String nameEndElement = empidStartElement; 

String xml = "<employee><name>Jack<empid>emp001</empid></name></employee>"; 

Integer nameStartPosition = xml.indexOf(nameStartElement)+nameStartElement.length; 
Integer nameEndPosition = xml.indexOf(nameEndElement); 

String name = xml.substring(nameStartPosition, nameEndPosition); 
+0

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

0

Просто изменить строку:

NodeList listOfPersons = getElementsByTagName ("NAME");

к:

NodeList listOfPersons = doc.getChildNodes();

выход:

Корневой элемент документ является Служащий

Имя: Jack

ID: EMP001

Адрес: 12 CA, USA

Смежные вопросы