2016-02-08 1 views
-2

Как я могу генерировать файл Java, значит сгенерировать имя методов классов атрибутов, без использования каких-либо API из XMLГенерирование Java-файл из файла XML без каких-либо API

мой XML-файл: Источник

<class name="person"> 

<Attribut type="int">Age</Attribut> 
<Attribut type="String">Name</Attribut> 
</class> 

в Java файл:

public class person { 
    int age; 
    String Name; 
} 

Ваша помощь очень ценится

Спасибо

+1

Пожалуйста, укажите пример источника, который объясняет, что вы пытались сделать. – SubOptimal

+0

Если вы не хотите использовать какой-либо XML-API (например, [Simple API for XML] (https://docs.oracle.com/javase/tutorial/jaxp/sax/index.html)), вам нужно будет написать парсер себя. Почему вы хотите это сделать? Как вы сказали, вы не хотите использовать JAXB. Почему бы не использовать хотя бы SAX? – SubOptimal

ответ

1

Если вы все еще хотите сделать это самостоятельно. Вы можете взглянуть на этот упрощенный пример.

Предупреждения первых:

  • ему не хватает надлежащего обработки исключений
  • это построить только для работы с предлагаемым например XML

Образец кода

import java.io.FileInputStream; 
import java.io.IOException; 
import javax.xml.stream.FactoryConfigurationError; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamConstants; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.XMLStreamReader; 

public class XMLStreamReaderDemo { 

    public static void main(String[] args) throws Exception { 
     String xmlFileName = "source.xml"; 
     StringBuilder javaSource = transform(xmlFileName); 
     System.out.println(javaSource); 
    } 

    static StringBuilder transform(String xmlFileName) throws 
      FactoryConfigurationError, IOException, XMLStreamException { 
     XMLInputFactory factory = XMLInputFactory.newInstance(); 
     XMLStreamReader parser = null; 
     StringBuilder source = new StringBuilder(); 
     try (FileInputStream inputStream = new FileInputStream(xmlFileName)) { 
      parser = factory.createXMLStreamReader(inputStream); 
      while (parser.hasNext()) { 
       switch (parser.getEventType()) { 
        case XMLStreamConstants.START_ELEMENT: 
         processStartElement(parser, source); 
         break; 
        case XMLStreamConstants.CHARACTERS: 
         processCharacters(parser, source); 
         break; 

        case XMLStreamConstants.END_ELEMENT: 
         processEndElement(parser, source); 
         break; 
        default: 
         break; 
       } 
       parser.next(); 
      } 
     } finally { 
      if (parser != null) { 
       parser.close(); 
      } 
     } 
     return source; 
    } 

    static void processEndElement(XMLStreamReader reader, StringBuilder sb) { 
     String element = reader.getLocalName(); 
     if ("class".equals(element)) { 
      sb.append("}"); 
     } else if ("Attribut".equals(element)) { 
      sb.append(";\n"); 
     } 
    } 

    static void processCharacters(XMLStreamReader reader, StringBuilder sb) { 
     if (!reader.isWhiteSpace()) { 
      sb.append(" ").append(reader.getText()); 
     } 
    } 

    static void processStartElement(XMLStreamReader reader, StringBuilder sb) { 
     String element = reader.getLocalName(); 
     if ("class".equals(element)) { 
      sb.append("public class ") 
        .append(reader.getAttributeValue(0)) 
        .append(" {\n"); 
     } else if ("Attribut".equals(element)) { 
      sb.append(" ") 
        .append(reader.getAttributeValue(0)); 
     } 
    } 
} 

Предполагая, что source.xml содержит

<class name="person"> 
<Attribut type="int">Age</Attribut> 
<Attribut type="String">Name</Attribut> 
</class> 

код выводит

public class person { 
    int Age; 
    String Name; 
} 

«единственной», что осталось для вас сделать: выполнить все недостающие части. Если это все еще содержит «слишком много» XML API ... ну ... напишите свой собственный парсер. ;-)

+0

Спасибо вам большое! –

0

Вы можете создать Java-классы из xsd or xml файла без использования кода Java или использовать файл класса JAXB https://jaxb.java.net/ или EXE файла по умолчанию, предоставляемый Java, расположенный в папке JDK бен xjc.exe

документация на https://docs.oracle.com/javase/8/docs/technotes/tools/unix/xjc.html

+2

Это неправильно! JAXB может использоваться для генерации кода Java из * XML-схем * документов, а не из любого XML. –

+1

Было бы неплохо увидеть, как 'xjc' мог бы построить из предоставленного XML-источника источник Java. – SubOptimal

+0

но без api jaxb только java! –

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