Как преобразовать переменную javascript в xml в качестве предупреждения?

Я видел различные связанные темы по этому поводу, но ни один из ответов, похоже, не работал и / или не имел отношения к моей конкретной проблеме.

У меня есть строка данных, отформатированная моим скриптом и сохраненная как var. Пример однажды отформатированной переменной выводит что-то вроде этого:

ABC, 123, XXXXXX, 22, MARK, XXXX.DEF, 345, XXX, XX, 46, ORL, 093782

при этом начало каждого нового набора обозначается символом '.' (кроме первого значения), и каждая часть данных в наборе разделяется символами ','. Этот же формат продолжается еще примерно с 15 записями без единого размера записей, некоторые из которых содержат 3-4 элемента данных, а некоторые - 10 или более.

Я хочу иметь возможность выводить эти данные как alert (), читающий что-то вроде следующего:

<Group>
    <Set name = "ABC">
        <Entry name = "1">123</Entry>
        <Entry name = "2">XXXXXX</Entry>
        <Entry name = "3">22</Entry>
        <Entry name = "4">MARK</Entry>
        <Entry name = "5">XXXX</Entry>
    </Set>
    <Set name = "DEF">
        <Entry name = "1">345</Entry>
        <Entry name = "2">XXX</Entry>
        <Entry name = "3">XX</Entry>
        <Entry name = "4">46</Entry>
        <Entry name = "5">ORL</Entry>
        <Entry name = "6">093782</Entry>
    </Set>
</Group>

Вопрос: Как мне это сделать?

Создайте узел группы с помощью JS. Затем я бы разделил вашу строку данных на массив, основанный на каждом ".". Тогда у вас будет каждый набор. Теперь вы можете перебирать массив наборов. Для каждого набора выполните итерацию и разделите эту строку на массив на каждом «,». Теперь выполните итерацию по каждой записи, создайте узел xml «entry» и добавьте его к родительскому элементу Set.

RoboYak 11.04.2018 11:48
1
1
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У ваших <Entry есть конечные теги </Set>, я полагаю, это просто опечатка?

Поскольку вы говорите, что хотите вывести данные в тревога, вам просто нужна строка, которую легко построить с помощью методов Array:

const input = 'ABC,123,XXXXXX,22,MARK,XXXX.DEF,345,XXX,XX,46,ORL,093782';
const allSetsStr = input.split('.')
  .map(commaSeparatedStr => commaSeparatedStr.split(','))
  // if you want to filter out sets with an entryName of 345:
  .filter(([, ...entryNames]) => !entryNames.includes('345'))
  .map(([setName, ...entryNames]) => {
    const allEntrysString = entryNames
      .map((entryName, entryI) => `    <Entry name = "${entryI}">${entryName}</Entry>`)
      .join('\n');
    return `  <Set name=${setName}>
${allEntrysString}
  </Set>`;
  })
  .join('\n');
const outputStr = '<Group>\n' + allSetsStr + '\n</Group>';
console.log(outputStr);

Еще один вопрос, который у меня есть, - как я могу пропустить определенный набор, но только если он содержит определенное значение в своих записях? Так что не console.log весь Набор «ABC», но только если в этом экземпляре ABC есть элемент, равный «321» или что-то в этом роде.

Yungwilder 12.04.2018 11:53

Просто filter разделенный commaSeparatedStr, прежде чем приступить к его сопоставлению - отфильтруйте наборы, если entryNames содержит 321.

CertainPerformance 12.04.2018 21:40

Не могли бы вы отредактировать свой текущий ответ, чтобы представить это?

Yungwilder 12.04.2018 23:21

Хорошо, в какой-то степени это работает, но как мне также проверить, является ли набор name = "ABC", потому что его фильтрующие наборы, которые не начинаются с ABC, но содержат "321".

Yungwilder 12.04.2018 23:38

Я смог добавить набор в фильтр с помощью || оператор и все заработало.

Yungwilder 13.04.2018 00:15

Другие вопросы по теме