Разбор XML-строк в MATLAB - PullRequest
       2

Разбор XML-строк в MATLAB

7 голосов
/ 29 февраля 2012

Мне нужно проанализировать строку XML с помощью MATLAB (осторожно: без ввода-вывода файла, поэтому я не хочу записывать строку в файл, а затем читать их). Я получаю строки из HTTP-соединения, и анализ должен быть очень быстрым. В основном меня беспокоит чтение значений определенных тегов во всей строке

Сеть полна смертельных угроз, связанных с анализом XML с помощью регулярных выражений, поэтому я пока не хотел вдаваться в подробности. Я знаю, что в MATLAB бесшовная интеграция с Java, но я не очень разбираюсь в Java. Есть ли быстрый способ получить определенные значения из XML очень быстро?

Например, я хочу получить информацию об объеме из этой строки ниже и записать ее в переменную.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>


<root>
  <volume>256</volume>
  <length>0</length>
  <time>0</time>
  <state>stop</state>
  ....

Ответы [ 3 ]

7 голосов
/ 29 февраля 2012

Ниже приведен исполняемый Java-код Matlab для выполнения требуемой задачи без записи в промежуточный файл:

%An XML formatted string
strXml = [...
    '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>' char(10)...
    '<root>' char(10) ...
    '  <volume>256</volume>' char(10) ...
    '  <length>0</length>' char(10) ...
    '  <time>0</time>' char(10) ...
    '  <state>stop</state>' char(10) ...
    '</root>' ];

%"simple" java code to create a document from said string
xmlDocument = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder.parse(java.io.StringBufferInputStream(strXml));

%"intuitive" methods to explore the xmlDocument
nodeList = xmlDocument.getElementsByTagName('volume');
numberOfNodes = nodeList.getLength();

firstNode = nodeList.item(0);
firstNodeContent = firstNode.getTextContent;

disp(firstNodeContent);  %Returns '256'

В качестве альтернативы, если ваше приложение позволяет это, рассмотрите возможность передачи URL-адреса непосредственно в ваш XML-анализатор. Непроверенный Java-код приведен ниже, но, вероятно, он также открывает встроенную в Matlab функцию xslt.

xmlDocument = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder.parse('URL_AS_A_STRING_HERE');

Документация здесь . Начните с пакета "javax.xml.parsers".

1 голос
/ 04 марта 2012

Я совсем не знаком с API-интерфейсами Matlab, но я хотел бы отметить, что использование метода DOM, описанного в Pursuit, займет больше времени / памяти, если вы хотите, чтобы только определенные значения из потока XML возвращались через HTTP-соединение.

Хотя STAX обеспечит вам самый быстрый подход к анализу в Java, использование API может быть громоздким, особенно если вы не очень знакомы с Java. Вы можете использовать SJXP , который является чрезвычайно тонкой абстракцией синтаксического анализа STAX в Java (отказ от ответственности: я автор), который позволяет вам определять пути к нужным элементам, а затем выдает парсеру поток ( ваш поток HTTP в этом случае), и он вытягивает все значения для вас.

В качестве примера, допустим, что вы хотели получить значения / root / state и / root / volume из примеров XML, которые вы разместили, фактическая Java будет выглядеть примерно так:

// Create /root/state rule
IRule stateRule = new DefaultRule(Type.CHARACTER, "/root/state") {
    @Override
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
        System.out.println("State is: " + text);
    }
}

// Create /root/volume rule
IRule volRule = new DefaultRule(Type.CHARACTER, "/state/volume") {
    @Override
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
        System.out.println("Volume is: " + text);
    }
}

// Create the parser with the given rules
XMLParser parser = new XMLParser(stateRule, volRule);

Вы можете выполнить всю эту инициализацию при запуске программы, а через некоторое время, когда вы обрабатываете поток из HTTP-соединения, вы можете сделать что-то вроде:

parser.parser(httpConnection.getOutputStream());

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

Как я уже упоминал, я не знаком с Matlab и не знаю правильных способов "Matlab-i-fy" этого кода, но, похоже, из первого примера вы можете более или менее просто использовать Java API напрямую в этом случае это решение будет быстрее и будет использовать значительно меньше памяти для анализа, если это важно, чем подход DOM.

1 голос
/ 29 февраля 2012

Существует целый класс функций для работы с xml, включая xmlread и xmlwrite.Это должно быть очень полезно для вашей проблемы.

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