2012-07-02 1 views
4

Как и в названии, в настоящее время я имею дело с необходимостью синтаксического анализа строки в формате XML, сохраняя информацию о символьном индексе начала тега элемента и конце тега элемента в исходной строке. Я смотрел SAX и DOM, и я не могу найти ничего, что предоставило бы мне эти данные. Какие-либо предложения?Как анализировать XML-строку и извлекать индекс символов?

Спасибо.

ответ

0

Не уверен, что полезно, но при условии, что SAX является последовательным, не могли ли вы сохранить счетчик символов? Единственная проблема заключается в том, что некоторые пробелы могут игнорироваться.

+0

Где именно я должен держать счетчик и как его увеличить? Можете ли вы немного разобраться? – user1403565

0

Возможно, вы захотите посмотреть Locator, DefaultHandler и SAXParser. В качестве примера, который дает номер строки и номер столбца:

public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { 
    String xml = 
      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
      "<project \n"+ 
      ">\n"+ 
      " <description>A description</description>\n"+ 
      "</project>\n"; 
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    SAXParser sp = spf.newSAXParser(); 
    InputSource inps = new InputSource(new StringReader(xml)); 
    DefaultHandler df = new XDefaultHandler(); 
    sp.parse(inps, df); 
} 

static class XDefaultHandler extends DefaultHandler { 
    Locator l = null; 

    @Override 
    public void setDocumentLocator(Locator locator) { 
     l = locator; 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     System.out.println("element: " + qName); 
     System.out.println("locator: " + l.getLineNumber() + "/" + l.getColumnNumber()); 
    } 
} 

Выходной сигнал является:

element: project 
locator: 3/2 
element: description 
locator: 4/18 

Override других методов в XDefaultHandler для приема вызовов для конца элементов и т.д.

EDIT: (слишком рано нажмите кнопку)

Из документации Locator.getLineNumber():

Верните номер строки, где заканчивается текущее событие документа. Строки ограничены концами строк, которые определены в спецификации XML.

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

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

+0

Поскольку я буду искать различные разделы документа по индексу, строке и столбцу, к сожалению, это не поможет. – user1403565

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