Xpath: выберите несколько Parent, если существует несколько Child - PullRequest
1 голос
/ 30 сентября 2019

У меня проблемы с получением нескольких значений XML-файла в HTML-таблицу.

Я хочу иметь имя всех родителей со свойствами destinationConnectors в tcp.TcpDispatcherProperties со следующим выражением xpath:

"/serverConfiguration/channels/channel[destinationConnectors/connector/properties[@class='com.mirth.connect.connectors.tcp.TcpDispatcherProperties']]/name"

с этим выражением:

родитель отображается только один раз, даже если у него есть несколько адресатов с этим классом

проблема в том, чтоесли есть несколько destinationConnectors [1..n], я получаю родителя от // channel / name только один раз в моей html-таблице.

Например, что я хочу отобразить в Javascript с помощью xml.evaluate,если у меня есть 3 канала - Channel1 с 1 адресатом и Channel2 с 2 адресатами:

------------  -------------  -------------
Channel1Name | Channel2Name | Channel2Name
------------  -------------  -------------
Destination1  Destination2a  Destination2b

Какой вывод я хочу получить:

  • Channel1Name from "/serverConfiguration / channel / channel / name "
  • Channel2Name от" / serverConfiguration / channel / channel / name "
  • Channel2Name от" / serverConfiguration / channel / channel / name "

not

  • Channel1Name
  • Channel2Name

Treeпредставление структуры XML

выдержка XML:

<channelGroup version="3.4.2">
  <id>e03a0301-4e29-405e-8ee0-f7a47e30d033</id>
  <channels>
    <channel version="3.4.2">
      <id>e4dccb26-b645-4245-bb7e-67e1e4901cd2</id>
      <name>Channel1</name>
      <destinationConnectors>
        <connector version="3.4.2">
          <name>Destination 1</name>
          <properties class="com.mirth.connect.connectors.tcp.TcpDispatcherProperties" version="3.4.2">
            <pluginProperties/>
          </properties>
        </connector>
      </destinationConnectors>
    </channel>
    <channel version="3.4.2">
      <id>b33ea541-e723-47a6-af52-e76648c5674e</id>
      <name>Channel2</name>
      <destinationConnectors>
        <connector version="3.4.2">
          <name>Destination 2a</name>
          <properties class="com.mirth.connect.connectors.tcp.TcpDispatcherProperties" version="3.4.2">
            <pluginProperties/>
          </properties>
        </connector>
        <connector version="3.4.2">
          <name>Destination 2b</name>
          <properties class="com.mirth.connect.connectors.tcp.TcpDispatcherProperties" version="3.4.2">
            <pluginProperties/>
          </properties>
        </connector>
      </destinationConnectors>
    </channel>
  </channels>
</channelGroup>

Запрос Javascript:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        showResult(xhttp.responseXML,"/serverConfiguration/channels/channel/destinationConnectors/connector/properties[@class='com.mirth.connect.connectors.tcp.TcpDispatcherProperties']/concat(../../../name, ' : ',  ../name)", "destTcpChannelName");
    }
};
xhttp.open("GET", "edited/23-07-2019-MirthBackup.xml", true);
xhttp.send();
function showResult(xml, path, head) {
    var txt = "<th>" + head +"</th><tr>";
    if (xml.evaluate) {
       var nodes = xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
       var result = nodes.iterateNext();
       while (result) {
          txt += "<td>" + result.childNodes[0].nodeValue + "</td>";
          result = nodes.iterateNext();
       }
    }
    document.getElementById(head).innerHTML = txt + "</tr>";
}

1 Ответ

2 голосов
/ 01 октября 2019

Следующий запрос xpath возвращает то, что вам нужно:

//channel/destinationConnectors/connector/properties[@class='com.mirth.connect.connectors.tcp.TcpDispatcherProperties']/concat(../../../name, ' : ',  ../name)

Описание:

  • //channel:

    для каждого channelэлемент где угодно

  • /destinationConnectors/connector:

    спуск до properties через destinationConnectors/connector/

  • /properties[@class='com.mirth.connect.connectors.tcp.TcpDispatcherProperties']:

    выберите каждый найденный properties с атрибутом class == c.m.c.c.t.TcpDispatcherProperties

  • /concat(../../../name, ' : ', ../name):

    concat() grand-прародитель channel name с родительским connector name элементом

Вернет:

Channel1 : Destination 1
Channel2 : Destination 2a
Channel2 : Destination 2b

Обновленный образец: http://xpather.com/o3eFcOCg

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