Как найти все узлы xml с одинаковым значением атрибута - PullRequest
0 голосов
/ 03 января 2019

Мне нужно запросить содержимое тега XML, сопоставить все родительские узлы с одинаковым идентификатором и показать результат на странице.

псевдокод:

  1. loadXML-файл
  2. получить ввод от пользователя (var inputTerm)
  3. найти inputTerm в теге XML <term>
  4. получить идентификатор родительского узла <entry>
  5. найти все входные узлы с одинаковым идентификатором из inputTerm
  6. показать все дочерние узлы для этих записей

Я получил шаг 4 в псевдокоде, но не знаю, как перейтина.Я должен снова пройтись по XML-файлу, чтобы найти все теги ввода с идентичным идентификатором.

XML:

<terms>
    <entry ID="1">
        <language>en</language>
        <term>user</term>
        <state>text</state>
        <use>text</use>
        <definition>text</definition>
        <definition-source>text</definition-source>
        <source>text</source>
        <circle>text</circle>
    </entry>
    <entry ID="1">
        <language>de</language>
        <term>user1</term>
        <state>text</state>
        <use>text</use>
        <definition>text</definition>
        <definition-source>text</definition-source>
        <source>text</source>
        <circle>text</circle>
    </entry>
    <entry ID="2">[...]</entry>
    [...]
</term>

jQuery:

$.ajax({
  type: "GET" ,
  url: "assets/db/export.xml" ,
  dataType: "xml" ,
  success: function(xml) {

    $('entry', xml).each(function() {
      var $entry = $(this)
      var xterm = $entry.find("term").text();

      $('#submit').click(function() {
        // get input from user
        var inputTerm = $('#find-term').val();
        // match user input and XML content
        if (inputTerm === xterm) {
          // get ID from matching term
          var matchingID = $entry.attr('ID');
          console.log(matchingID);
          // How to go on here?
          var language = $entry.find("language").text();
          var term = $entry.find("term").text();
          var state = $entry.find("state").text();
          var use = $entry.find("use").text();
          var definition = $entry.find("definition").text();
          var definitionSource = $entry.find("definition-source").text();
          var source = $entry.find("source").text();
          var circle = $entry.find("circle").text();
          // show results
          $('.values').append('<li>' + language + '</li>');
          $('.term').append('<li>' + term + '</li>');
          $('.state').append('<li>' + state + '</li>');
          $('.usage').append('<li>' + use + '</li>');
          $('.definition').append('<li>' + definition + '</li>');
          $('.definition-source').append('<li>' + definitionSource + '</li>');
          $('.source').append('<li>' + source + '</li>');
          $('.circle').append('<li>' + circle + '</li>');
        }
        else {
          console.log("No entry found.");
        }
      });
    })
  }     
});

Могу ли ядобавить каждую секунду и как сопоставить все записи с одинаковым идентификатором?

1 Ответ

0 голосов
/ 03 января 2019

Вот что я хотел бы сделать:

  1. загрузить файл XML
  2. , когда это будет сделано, включите кнопку отправки (сначала отключите ее)
  3. при нажатии,
    1. поиск в XML-документе соответствующих терминов
    2. извлечение значений из атрибутов ID, связанных с соответствием (ями)
    3. фильтрация записей XML в соответствии сэти идентификаторы
    4. добавить найденные результаты на страницу

Я предполагаю, что вы хотите поддерживать поиск терминов без учета регистра, поэтому я добавил для этого помощника:

// helper for jQuery.fn.filter
function containsCaseInsensitive(searchTerm) {
    return function () {
        return $(this).text().toUpperCase().includes(searchTerm.toUpperCase());
    };
}

$.get("assets/db/export.xml").done(function (exportXml) {
    var $exportXml = $(exportXml);

    // enable button and attach event handler after download is done
    $('#submit').prop("disabled", false).click(function() {
        var searchTerm = $('#find-term').val();
        var $terms = $exportXml.find("term").filter(containsCaseInsensitive(searchTerm));
        var ids = $terms.map(function () { return $(this).parent().attr("ID"); }).toArray();
        var $entries = $exportXml.find("entry").filter(function () { return ids.includes( $(this).attr("ID") ); });

        // don't forget to empty out the search result display

        if (!$entries.length) alert("No entry found.");

        $entries.each(function () {
            var $entry = $(this);
            $("<li>", {text: $entry.children("language").text()}).appendTo(".values");
            $("<li>", {text: $entry.children("term").text()}).appendTo(".term");
            $("<li>", {text: $entry.children("state").text()}).appendTo(".state");
            $("<li>", {text: $entry.children("use").text()}).appendTo(".usage");
            $("<li>", {text: $entry.children("definition").text()}).appendTo(".definition");
            $("<li>", {text: $entry.children("definition-source").text()}).appendTo(".definition-source");
            $("<li>", {text: $entry.children("source").text()}).appendTo(".source");
            $("<li>", {text: $entry.children("circle").text()}).appendTo(".circle");
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...