Распечатать все возможности для XML-элемента в Python 2-7

1

Я пытаюсь программировать в Python скрипт, который автоматически генерирует XML файл с некоторой информацией там.

Поэтому я застрял на Точке. У меня 6 подэлементов. Текст подэлемента может быть 0 или 1. Я хочу напечатать все возможности для 6 элементов.

Что я имею:

listTCPFlag["fin","syn","rst","psh","ack","urg"]
lustTCPFlagAnswer = [0,1]

listProtocol = ['TCP','UDP','ICMP']
top = Element('Test')
ipHeader = SubElement(top, 'IpHeader')    
ipProtocol = SubElement(ipHeader,'protocol')

    for x in range(len(listProtocol)):
        ipProtocol.text = str(listProtocol[x])

        if(ipProtocol.txt == "TCP"):
             tcpHeader = SubElement(top, "tcpHeader")
             tcpPort = SubElement(tcpHeader,"destPort")
             tcpFlag = SubElement(tcpHeader, "flag")

             tcpFlagFin = SubElement(tcpFlag, "fin")
             tcpFlagSyn = SubElement(tcpFlag, "syn")
             tcpFlagRst = SubElement(tcpFlag, "rst")
             tcpFlagPsh = SubElement(tcpFlag, "psh")
             tcpFlagAck = SubElement(tcpFlag, "ack")
             tcpFlagUrg = SubElement(tcpFlag, "urg")


             # I tried to implement this in a for loop:

             for z in range(len(listTCPFlag)):
                 for u in range(len(listTCPFlagAnswer)):

                     if(listTCPFlag[z] == "fin"):
                           tcpFlagFin.text = str(listTCPFlagAnswer[u])

                     # ...

После тщательного рассмотрения и тестирования я обнаружил, что цикл неправильный. И теперь у меня пропал мысли и не знаю, как я могу исправить эту проблему. Мой вывод должен выглядеть так:

Пример:

  1. <root>
    <element_1> 0 </element_1>
    <element_2> 0 </element_2>
    <element_3> 0 </element_3>
    <element_4> 0 </element_4>
    <element_5> 0 </element_5>
    <element_6> 0 </element_6>
    </root>

  2. <root>
    <element_1> 0 </element_1>
    <element_2> 0 </element_2>
    <element_3> 0 </element_3>
    <element_4> 0 </element_4>
    <element_5> 0 </element_5>
    <element_6> 1 </element_6>
    </root>

  3. <root>
    <element_1> 0 </element_1>
    <element_2> 0 </element_2>
    <element_3> 0 </element_3>
    <element_4> 0 </element_4>
    <element_5> 1 </element_5>
    <element_6> 0 </element_6>
    </root>

  4. <root>
    <element_1> 0 </element_1>
    <element_2> 0 </element_2>
    <element_3> 0 </element_3>
    <element_4> 1 </element_4>
    <element_5> 0 </element_5>
    <element_6> 0 </element_6>
    </root>

  5. ....

  6. (в конце концов)

<root>
<element_1> 1 </element_1>
<element_2> 1 </element_2>
<element_3> 1 </element_3>
<element_4> 1 </element_4>
<element_5> 1 </element_5>
<element_6> 1 </element_6>
</root>

После этого я попробую его с помощью функции "add_binary_nums (x, y)". Например: https://www.w3resource.com/python-exercises/challenges/1/python-challenges-1-exercise-31.php

Для моего мнения я предпочитаю for-loop, который может справиться с этим. Но у меня нет идеи, как она может быть построена. Как я могу сделать это просто в Python 2 и в For-loop?

  • 0
    Почему вторая группа в вашем примере 010000 вместо 000001 ? Вы хотите их в рандомизированном порядке?
  • 0
    Ошибка печати, sry ... Я отредактировал это, я не хочу, их в рандомизированном порядке ...: s
Показать ещё 5 комментариев
Теги:

1 ответ

1
Лучший ответ

Самый сжатый способ сделать это, о котором я могу думать, - написать цикл for который выполняет итерацию по всем числам от 0 до 63 (2^6 - 1) в двоичном формате, поскольку это будет идти от 000000 до 111111. Затем разделите каждое число на отдельные цифры и поместите каждую цифру в один из тэгов <element>.

Вот пример:

all_possibilities = []

for n in range(2**6):
    binary = format(n, '06b')
    tcp_flag_elements = []
    for i in range(len(binary)):
        subelement = SubElement(tcpFlag, listTCPFlag[i])
        subelement.text = binary[i]
        tcp_flag_elements.append(subelement)
    all_possibilities.append(tcp_flag_elements)

Это оставит вам список all_possibilities содержащий 64 списка, по одному для каждой из возможных конфигураций ваших подэлементов.

  • 0
    Должно ли это 06b быть 0:b ?
  • 1
    @Chillie Я думаю, что это обозначение str.format , но здесь этот format является немного более прямым способом преобразования n в двоичный файл. В частности, значение 6 важно, чтобы все двоичные числа имели одинаковую длину, а значение 0 говорит о том, чтобы заполнить пространство 0 , так что, например, 2 получается как 000010 вместо просто 10 .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню