готовый парсер в Java - PullRequest
       35

готовый парсер в Java

0 голосов
/ 28 августа 2009

У меня есть определенный пользователем тег. например, данные здесь, jssj. У меня есть файл (не xml), который содержит некоторые данные, встроенные в теги. Для этого мне нужен анализатор, который определит мои теги и извлечет данные в надлежащем формате. Например,

<newpage> thix text </newpage>
<tagD>
 <tagA> kk</tagA>
</tagD>
Теги

могут также иметь некоторые атрибуты, такие как теги html. Например,

<mytag height="f" width ="d" > bla bla bla </mytag>
<mytag attribute="val"> bla bla bla</mytag>

Ответы [ 5 ]

2 голосов
/ 28 августа 2009

Вы можете использовать JAXB, уже включенный в Java. Это довольно просто. Сначала вам нужно создать привязку к вашему XML-коду. Привязка обеспечивает отображение между объектами Java и кодом XML.

Примером может быть:

@XmlRootElement(name = "YourRootElement", namespace ="http://someurl.org")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "intValue",
    "stringArray",
    "stringValue"}
)
public class YourBindingClass {
    protected int intValue;

    @XmlElement(nillable = false)
    protected List<String> stringArray;

    @XmlElement(name = "stringValue", required = true)
    protected String stringValue;

    public int getIntValue() {
        return intValue;
    }

    public void setIntValue(int value) {
        this.intValue = value;
    }

    public List<String> getStringArray() {
        if (stringArray == null) {
            stringArray = new ArrayList<String>();
        }
        return this.stringArray;
    }

    public String getStringValue() {
        return stringValue;
    }

    public void setStringValue(String value) {
        this.stringValue = value;
    }
}

Затем, чтобы закодировать ваши объекты Java в XML, вы можете использовать:

YourBindingClass yourBindingClass = ...;
JAXBContext jaxbContext = JAXBContext.newInstance(YourBindingClass.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);

/** If you need to specify a schema */
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new URL("http:\\www.someurl.org"));      
marshaller.setSchema(schema);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, true);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
marshaller.marshal(yourBindingClass, stream);
System.out.println(stream);

Чтобы проанализировать ваш XML обратно к объектам:

InputStream resourceAsStream = ... // Your XML, File, etc. 
JAXBContext jaxbContext = JAXBContext.newInstance(YourBindingClass.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Object r = unmarshaller.unmarshal(resourceAsStream);
if (r instanceof YourBindingClass) ...

Пример, начиная с объекта Java:

YourBindingClass s = new YourBindingClass();
s.setIntValue(1);
s.setStringValue("a");
s.getStringArray().add("b1");
s.getStringArray().add("b2");

// marshal ...

Результат:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:YourRootElement xmlns:ns2="http://someurl.org">
    <intValue>1</intValue>
    <stringArray>b1</stringArray>
    <stringArray>b2</stringArray>
    <stringValue>a</stringValue>
</ns2:YourRootElement>

Если вы не знаете формат ввода, это означает, что у вас, вероятно, нет схемы XML. Если у вас нет схемы, у вас ее нет, например:

  • Проще описать допустимое содержание документа
  • проще проверить правильность данных
  • Легче определить фасеты данных (ограничения для данных)
  • Проще определить шаблоны данных (форматы данных)
  • Проще преобразовывать данные между различными типами данных

В любом случае предыдущий код также работает с XML-кодом, который содержит «неизвестные» теги. Однако ваш XML-код все еще должен представить обязательные поля и следовать заявленным шаблонам. Таким образом, следующий код XML также допустим. Единственное ограничение: там должен быть тег 'stringValue'. Обратите внимание, что stringArrayQ не был ранее объявлен.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:YourRootElement xmlns:ns2="http://someurl.org">
         <stringValue>a</stringValue>
         <stringArrayQ>b1</stringArrayQ>
</ns2:YourRootElement>
2 голосов
/ 28 августа 2009

Вы можете посмотреть генератор парсера как antlr .

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

1 голос
/ 28 августа 2009

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

0 голосов
/ 28 августа 2009

Ваш пример - XML ​​с этой модификацией:

<root>
  <newpage> thix text </newpage>
  <tagD>
    <tagA> kk</tagA>
  </tagD>
</root>

Вы можете использовать любой анализатор XML, который хотите проанализировать.

Edit:

Атрибуты являются нормальной частью XML.

<root>
  <newpage> thix text </newpage>
  <tagD>
    <tagA> kk</tagA>
  </tagD>
  <mytag height="f" width ="d" > bla bla bla </mytag>
  <mytag attribute="val"> bla bla bla</mytag>
</root>

Каждый XML-парсер может иметь с ними дело.

Edit:

Если бы вы могли использовать Python, вы можете сделать что-то вроде этого:

import lxml.etree

doc = lxml.etree.parse("foo.xml")
print doc.xpath("//mytag[1]/@width")
# => ['d']

Это то, что я называю простым.

0 голосов
/ 28 августа 2009

Для тегов XML - используйте анализатор DOM или SAX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...