Я пытаюсь извлечь на основе содержимого на данном xpath. Когда это - всего один элемент, я хочу извлечь, нет никакой проблемы. Когда у меня есть список объектов, соответствующих этому xpath, затем я получаю nodelist, и я могу извлечь значения.
Однако существует пара объектов, связанных друг с другом формирующим группу, и та группа повторяется.
Одним путем я мог сделать, должен получить nodelist родительского узла всех таких групп и затем применить основанный на SAX метод синтаксического анализа для извлечения информации. Но это представило бы шаблон определенное кодирование. Я хочу сделать это универсальным.напр.
<html><body>
<!--... a lot divs and other tags ... -->
<div class="divclass">
<item>
<item_name>blah1</item_name>
<item_qty>1</item_qty>
<item_price>100</item_price>
</item>
</div>
<div class="divclass">
<item>
<item_name>blah2</item_name>
<item_qty>2</item_qty>
<item_price>200</item_price>
</item>
</div>
<div class="divclass">
<item>
<item_name>blah3</item_name>
<item_qty>3</item_qty>
<item_price>300</item_price>
</item>
</div>
</body></html>
Я мог легко написать код для этого xml, но не универсального, который мог проанализировать любую данную спецификацию.
Я должен смочь создать a list
из map
из attribute-value
сверху.
Кто-либо попробовал это?
Список РЕДАКТИРОВАНИЯ входа xpaths:
1. "html:div[@class='divclass']/item/item_name"
2. "html:div[@class='divclass']/item/item_qty"
3. "html:div[@class='divclass']/item/item_price"
Ожидаемый вывод в простом тексте:
item_name:blah1;item_qty:1;item_price:100
item_name:blah2;item_qty:2;item_price:200
item_name:blah3;item_qty:3;item_price:300
Ключевой пункт здесь, если бы я применяю каждый xpath отдельно, он выбрал бы меня результаты вертикально, т.е. сначала каждый выберет весь item_names, второй выберет все количества. Таким образом, я буду освобождать co-отношение в этих частях.
Надежда это очищает мои требования.
Спасибо Nayn
Я думаю, что XQuery — отличное решение для очистки экрана. Вы можете использовать процессор Saxon для выполнения ваших xqueries. Кроме того, вы можете использовать расширение Piggy Bank для Firefox, чтобы легко находить выражения XPath, касающиеся контента, который вы хотите извлечь с веб-страницы, который вы можете использовать в своих xqueries.
Я не понимаю, чего вы хотите достичь и как это соотносится с XPath. Если вы хотите сопоставить XML с объектами Java, может помочь JAXB , но он основан на схемах XML, а не на XPath.
Я не уверен, что понял ваш вопрос, но похоже, что вы хотите использовать XPath в HTML-документах.
Чтобы использовать XPath, просматриваемый HTML-документ должен быть правильно сформирован. Есть несколько парсеров HTML для Java; в этой статье сравниваются 4 из них.
HtmlCleaner , кажется, предлагает то, что вам нужно. Это позволяет выполнять подмножество XPath в «очищенных» HTML-документах. По-видимому, он не поддерживает полный набор выражений XPath, см. документацию .
Если вам требуются более сложные выражения XPath, чем то, что поддерживает HtmlCleaner, вам может потребоваться использовать пакет javax.xml.xpath с правильно сформированным документом XHTML. JTidy может конвертировать HTML-документ в XHTML-документ.
Надеюсь, это ответ на ваш вопрос.
Не знаю, поможет ли это, но я использую XSLT, чтобы перейти от данных к HTML. Мне кажется, что вам просто нужно немного структурировать выполнение XPATH, и XSLT для этого хорош.
Почему бы не применить XPath в два этапа.
Сначала XPath для получения записей (строк в выводе):
//div[@class='divclass']/item
Затем XPath для получения полей (столбцов) относительно каждой записи:
item_name
item_qty
item_price
Вот рабочий код (в Javascript, сценарии Windows) дает вам желаемый результат:
var doc = new ActiveXObject("MSXML.DOMDocument");
doc.load("test.xml");
// XPATH #1
var recordXPath = "//div[@class='divclass']/item";
// XPATHS #2, in a dictionary ("field name":"XPath")
var fieldXPaths = { item_name : "item_name",
item_qty : "item_name",
item_price : "item_price" };
var items = doc.selectNodes(recordXPath);
for (var itemCtr = 0; itemCtr < items.length; itemCtr++) {
var item = items[itemCtr];
var fieldEntries = [];
for (var fieldName in fieldXPaths) {
var fieldXPath = fieldXPaths[fieldName];
var fieldNode = item.selectSingleNode(fieldXPath);
fieldEntries.push(fieldNode.tagName + ":" + fieldNode.text);
}
WScript.Echo(fieldEntries.join(";"));
}