XML Parsing Python with xmltodictCalling an external command in PythonWhat are metaclasses in Python?How can I safely create a nested directory in Python?How do I parse a string to a float or int in Python?Does Python have a ternary conditional operator?How do I parse XML in Python?Why can't Python parse this JSON data?Does Python have a string 'contains' substring method?How Do You Parse and Process HTML/XML in PHP?Parse JSON in JavaScript?

voltage of sounds of mp3files

Time travel short story where a man arrives in the late 19th century in a time machine and then sends the machine back into the past

Is there any reason not to eat food that's been dropped on the surface of the moon?

Is the destination of a commercial flight important for the pilot?

Products and sum of cubes in Fibonacci

Dot above capital letter not centred

Greatest common substring

Can a monster with multiattack use this ability if they are missing a limb?

How to be diplomatic in refusing to write code that breaches the privacy of our users

Go Pregnant or Go Home

If you attempt to grapple an opponent that you are hidden from, do they roll at disadvantage?

How do I define a right arrow with bar in LaTeX?

How do we know the LHC results are robust?

Will it be accepted, if there is no ''Main Character" stereotype?

Why does John Bercow say “unlock” after reading out the results of a vote?

Increase performance creating Mandelbrot set in python

What't the meaning of this extra silence?

Was Spock the First Vulcan in Starfleet?

Hide Select Output from T-SQL

Generic lambda vs generic function give different behaviour

What is the intuitive meaning of having a linear relationship between the logs of two variables?

Why Were Madagascar and New Zealand Discovered So Late?

Student evaluations of teaching assistants

What to do with wrong results in talks?



XML Parsing Python with xmltodict


Calling an external command in PythonWhat are metaclasses in Python?How can I safely create a nested directory in Python?How do I parse a string to a float or int in Python?Does Python have a ternary conditional operator?How do I parse XML in Python?Why can't Python parse this JSON data?Does Python have a string 'contains' substring method?How Do You Parse and Process HTML/XML in PHP?Parse JSON in JavaScript?













0















I need to extract information from various xml files within a directory. They all have the same structure but might have different amounts of values stored in pair " " /pair. I'm using xmltodict to access the different pair "values" /pair and store them in a dict.
The xml unfortunately looks somethin like this:



<license xmlns:="http://www.example.com">
<application name="TEST">
<operation>
<condition implication="stop" name="module">
<arguments>
<pair key="version">1</pair>
</arguments>
</condition>
<condition implication="stop" name="allowed">
<arguments>
<pair key="commandName">value1</pair>
<pair key="commandName">value2</pair>
<pair key="commandName">value3</pair>
<pair key="commandName">value4</pair>
</arguments>
</condition>
</operation>
</application>
</applications>




This is definitely not the best solution but I'm a total beginner and need to make this work. My code looks something like this



if application['@name'] == "Test":
for pair in application['operation']['condition'][1]['arguments']:
if pair["@key"]["#text"] == 'value1':
value1 = 'available'
if pair["@key"]["#text"] == 'value2':
value2 = 'available'
....
Test_dict = 'value1': value1, 'value2': value2....


And this is my output:



if pair["@key"]["#text"] == 'value1':

TypeError: string indices must be integers


How can I get this to work?




EDIT:



Me again, still trying to work this one out.



Jonathans Solution works for all scenarios, except for the one where I have one pair value only. for example:



<license xmlns:="http://www.example.com">
<application name="TEST">
<operation>
<condition implication="stop" name="module">
<arguments>
<pair key="version">1</pair>
</arguments>
</condition>
<condition implication="stop" name="allowed">
<arguments>
<pair key="commandName">value1</pair>
</arguments>
</condition>
</operation>
</application>
</license>


I still get the same error message.



if pair["#text"] == 'value2': TypeError: string indices must be integers


As long as there is more than one pair value this approach works perfectly fine. Any approach on how to fix this?










share|improve this question




























    0















    I need to extract information from various xml files within a directory. They all have the same structure but might have different amounts of values stored in pair " " /pair. I'm using xmltodict to access the different pair "values" /pair and store them in a dict.
    The xml unfortunately looks somethin like this:



    <license xmlns:="http://www.example.com">
    <application name="TEST">
    <operation>
    <condition implication="stop" name="module">
    <arguments>
    <pair key="version">1</pair>
    </arguments>
    </condition>
    <condition implication="stop" name="allowed">
    <arguments>
    <pair key="commandName">value1</pair>
    <pair key="commandName">value2</pair>
    <pair key="commandName">value3</pair>
    <pair key="commandName">value4</pair>
    </arguments>
    </condition>
    </operation>
    </application>
    </applications>




    This is definitely not the best solution but I'm a total beginner and need to make this work. My code looks something like this



    if application['@name'] == "Test":
    for pair in application['operation']['condition'][1]['arguments']:
    if pair["@key"]["#text"] == 'value1':
    value1 = 'available'
    if pair["@key"]["#text"] == 'value2':
    value2 = 'available'
    ....
    Test_dict = 'value1': value1, 'value2': value2....


    And this is my output:



    if pair["@key"]["#text"] == 'value1':

    TypeError: string indices must be integers


    How can I get this to work?




    EDIT:



    Me again, still trying to work this one out.



    Jonathans Solution works for all scenarios, except for the one where I have one pair value only. for example:



    <license xmlns:="http://www.example.com">
    <application name="TEST">
    <operation>
    <condition implication="stop" name="module">
    <arguments>
    <pair key="version">1</pair>
    </arguments>
    </condition>
    <condition implication="stop" name="allowed">
    <arguments>
    <pair key="commandName">value1</pair>
    </arguments>
    </condition>
    </operation>
    </application>
    </license>


    I still get the same error message.



    if pair["#text"] == 'value2': TypeError: string indices must be integers


    As long as there is more than one pair value this approach works perfectly fine. Any approach on how to fix this?










    share|improve this question


























      0












      0








      0








      I need to extract information from various xml files within a directory. They all have the same structure but might have different amounts of values stored in pair " " /pair. I'm using xmltodict to access the different pair "values" /pair and store them in a dict.
      The xml unfortunately looks somethin like this:



      <license xmlns:="http://www.example.com">
      <application name="TEST">
      <operation>
      <condition implication="stop" name="module">
      <arguments>
      <pair key="version">1</pair>
      </arguments>
      </condition>
      <condition implication="stop" name="allowed">
      <arguments>
      <pair key="commandName">value1</pair>
      <pair key="commandName">value2</pair>
      <pair key="commandName">value3</pair>
      <pair key="commandName">value4</pair>
      </arguments>
      </condition>
      </operation>
      </application>
      </applications>




      This is definitely not the best solution but I'm a total beginner and need to make this work. My code looks something like this



      if application['@name'] == "Test":
      for pair in application['operation']['condition'][1]['arguments']:
      if pair["@key"]["#text"] == 'value1':
      value1 = 'available'
      if pair["@key"]["#text"] == 'value2':
      value2 = 'available'
      ....
      Test_dict = 'value1': value1, 'value2': value2....


      And this is my output:



      if pair["@key"]["#text"] == 'value1':

      TypeError: string indices must be integers


      How can I get this to work?




      EDIT:



      Me again, still trying to work this one out.



      Jonathans Solution works for all scenarios, except for the one where I have one pair value only. for example:



      <license xmlns:="http://www.example.com">
      <application name="TEST">
      <operation>
      <condition implication="stop" name="module">
      <arguments>
      <pair key="version">1</pair>
      </arguments>
      </condition>
      <condition implication="stop" name="allowed">
      <arguments>
      <pair key="commandName">value1</pair>
      </arguments>
      </condition>
      </operation>
      </application>
      </license>


      I still get the same error message.



      if pair["#text"] == 'value2': TypeError: string indices must be integers


      As long as there is more than one pair value this approach works perfectly fine. Any approach on how to fix this?










      share|improve this question
















      I need to extract information from various xml files within a directory. They all have the same structure but might have different amounts of values stored in pair " " /pair. I'm using xmltodict to access the different pair "values" /pair and store them in a dict.
      The xml unfortunately looks somethin like this:



      <license xmlns:="http://www.example.com">
      <application name="TEST">
      <operation>
      <condition implication="stop" name="module">
      <arguments>
      <pair key="version">1</pair>
      </arguments>
      </condition>
      <condition implication="stop" name="allowed">
      <arguments>
      <pair key="commandName">value1</pair>
      <pair key="commandName">value2</pair>
      <pair key="commandName">value3</pair>
      <pair key="commandName">value4</pair>
      </arguments>
      </condition>
      </operation>
      </application>
      </applications>




      This is definitely not the best solution but I'm a total beginner and need to make this work. My code looks something like this



      if application['@name'] == "Test":
      for pair in application['operation']['condition'][1]['arguments']:
      if pair["@key"]["#text"] == 'value1':
      value1 = 'available'
      if pair["@key"]["#text"] == 'value2':
      value2 = 'available'
      ....
      Test_dict = 'value1': value1, 'value2': value2....


      And this is my output:



      if pair["@key"]["#text"] == 'value1':

      TypeError: string indices must be integers


      How can I get this to work?




      EDIT:



      Me again, still trying to work this one out.



      Jonathans Solution works for all scenarios, except for the one where I have one pair value only. for example:



      <license xmlns:="http://www.example.com">
      <application name="TEST">
      <operation>
      <condition implication="stop" name="module">
      <arguments>
      <pair key="version">1</pair>
      </arguments>
      </condition>
      <condition implication="stop" name="allowed">
      <arguments>
      <pair key="commandName">value1</pair>
      </arguments>
      </condition>
      </operation>
      </application>
      </license>


      I still get the same error message.



      if pair["#text"] == 'value2': TypeError: string indices must be integers


      As long as there is more than one pair value this approach works perfectly fine. Any approach on how to fix this?







      python xml parsing xmltodict






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Mar 20 at 16:11







      Robert

















      asked Mar 8 at 10:08









      Robert Robert

      12




      12






















          1 Answer
          1






          active

          oldest

          votes


















          1














          You're getting that error because you treat the string value inside pair["@key"] like a dict.



          Try using if pair["#text"] == 'value1': and it should work.



          The full code that works for me:



          import xmltodict

          xml = """
          <application name="TEST">
          <operation>
          <condition implication="stop" name="module">
          <arguments>
          <pair key="version">1</pair>
          </arguments>
          </condition>
          <condition implication="stop" name="allowed">
          <arguments>
          <pair key="commandName">value1</pair>
          <pair key="commandName">value2</pair>
          <pair key="commandName">value3</pair>
          <pair key="commandName">value4</pair>
          </arguments>
          </condition>
          </operation>
          </application>
          """

          d = xmltodict.parse(xml)

          if d['application']['@name'] == "TEST":
          for pair in d['application']['operation']['condition'][1]['arguments']['pair']:
          if pair["#text"] == 'value1':
          value1 = 'available'
          if pair["#text"] == 'value2':
          value2 = 'available'

          print(value1, value2)





          share|improve this answer























          • I updated the main question. Any chance you could look over it again?

            – Robert
            Mar 21 at 8:36










          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55060921%2fxml-parsing-python-with-xmltodict%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          You're getting that error because you treat the string value inside pair["@key"] like a dict.



          Try using if pair["#text"] == 'value1': and it should work.



          The full code that works for me:



          import xmltodict

          xml = """
          <application name="TEST">
          <operation>
          <condition implication="stop" name="module">
          <arguments>
          <pair key="version">1</pair>
          </arguments>
          </condition>
          <condition implication="stop" name="allowed">
          <arguments>
          <pair key="commandName">value1</pair>
          <pair key="commandName">value2</pair>
          <pair key="commandName">value3</pair>
          <pair key="commandName">value4</pair>
          </arguments>
          </condition>
          </operation>
          </application>
          """

          d = xmltodict.parse(xml)

          if d['application']['@name'] == "TEST":
          for pair in d['application']['operation']['condition'][1]['arguments']['pair']:
          if pair["#text"] == 'value1':
          value1 = 'available'
          if pair["#text"] == 'value2':
          value2 = 'available'

          print(value1, value2)





          share|improve this answer























          • I updated the main question. Any chance you could look over it again?

            – Robert
            Mar 21 at 8:36















          1














          You're getting that error because you treat the string value inside pair["@key"] like a dict.



          Try using if pair["#text"] == 'value1': and it should work.



          The full code that works for me:



          import xmltodict

          xml = """
          <application name="TEST">
          <operation>
          <condition implication="stop" name="module">
          <arguments>
          <pair key="version">1</pair>
          </arguments>
          </condition>
          <condition implication="stop" name="allowed">
          <arguments>
          <pair key="commandName">value1</pair>
          <pair key="commandName">value2</pair>
          <pair key="commandName">value3</pair>
          <pair key="commandName">value4</pair>
          </arguments>
          </condition>
          </operation>
          </application>
          """

          d = xmltodict.parse(xml)

          if d['application']['@name'] == "TEST":
          for pair in d['application']['operation']['condition'][1]['arguments']['pair']:
          if pair["#text"] == 'value1':
          value1 = 'available'
          if pair["#text"] == 'value2':
          value2 = 'available'

          print(value1, value2)





          share|improve this answer























          • I updated the main question. Any chance you could look over it again?

            – Robert
            Mar 21 at 8:36













          1












          1








          1







          You're getting that error because you treat the string value inside pair["@key"] like a dict.



          Try using if pair["#text"] == 'value1': and it should work.



          The full code that works for me:



          import xmltodict

          xml = """
          <application name="TEST">
          <operation>
          <condition implication="stop" name="module">
          <arguments>
          <pair key="version">1</pair>
          </arguments>
          </condition>
          <condition implication="stop" name="allowed">
          <arguments>
          <pair key="commandName">value1</pair>
          <pair key="commandName">value2</pair>
          <pair key="commandName">value3</pair>
          <pair key="commandName">value4</pair>
          </arguments>
          </condition>
          </operation>
          </application>
          """

          d = xmltodict.parse(xml)

          if d['application']['@name'] == "TEST":
          for pair in d['application']['operation']['condition'][1]['arguments']['pair']:
          if pair["#text"] == 'value1':
          value1 = 'available'
          if pair["#text"] == 'value2':
          value2 = 'available'

          print(value1, value2)





          share|improve this answer













          You're getting that error because you treat the string value inside pair["@key"] like a dict.



          Try using if pair["#text"] == 'value1': and it should work.



          The full code that works for me:



          import xmltodict

          xml = """
          <application name="TEST">
          <operation>
          <condition implication="stop" name="module">
          <arguments>
          <pair key="version">1</pair>
          </arguments>
          </condition>
          <condition implication="stop" name="allowed">
          <arguments>
          <pair key="commandName">value1</pair>
          <pair key="commandName">value2</pair>
          <pair key="commandName">value3</pair>
          <pair key="commandName">value4</pair>
          </arguments>
          </condition>
          </operation>
          </application>
          """

          d = xmltodict.parse(xml)

          if d['application']['@name'] == "TEST":
          for pair in d['application']['operation']['condition'][1]['arguments']['pair']:
          if pair["#text"] == 'value1':
          value1 = 'available'
          if pair["#text"] == 'value2':
          value2 = 'available'

          print(value1, value2)






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Mar 8 at 10:29









          Jonathan ShemerJonathan Shemer

          213




          213












          • I updated the main question. Any chance you could look over it again?

            – Robert
            Mar 21 at 8:36

















          • I updated the main question. Any chance you could look over it again?

            – Robert
            Mar 21 at 8:36
















          I updated the main question. Any chance you could look over it again?

          – Robert
          Mar 21 at 8:36





          I updated the main question. Any chance you could look over it again?

          – Robert
          Mar 21 at 8:36



















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55060921%2fxml-parsing-python-with-xmltodict%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Can't initialize raids on a new ASUS Prime B360M-A motherboard2019 Community Moderator ElectionSimilar to RAID config yet more like mirroring solution?Can't get motherboard serial numberWhy does the BIOS entry point start with a WBINVD instruction?UEFI performance Asus Maximus V Extreme

          Identity Server 4 is not redirecting to Angular app after login2019 Community Moderator ElectionIdentity Server 4 and dockerIdentityserver implicit flow unauthorized_clientIdentityServer Hybrid Flow - Access Token is null after user successful loginIdentity Server to MVC client : Page Redirect After loginLogin with Steam OpenId(oidc-client-js)Identity Server 4+.NET Core 2.0 + IdentityIdentityServer4 post-login redirect not working in Edge browserCall to IdentityServer4 generates System.NullReferenceException: Object reference not set to an instance of an objectIdentityServer4 without HTTPS not workingHow to get Authorization code from identity server without login form

          2005 Ahvaz unrest Contents Background Causes Casualties Aftermath See also References Navigation menue"At Least 10 Are Killed by Bombs in Iran""Iran"Archived"Arab-Iranians in Iran to make April 15 'Day of Fury'"State of Mind, State of Order: Reactions to Ethnic Unrest in the Islamic Republic of Iran.10.1111/j.1754-9469.2008.00028.x"Iran hangs Arab separatists"Iran Overview from ArchivedConstitution of the Islamic Republic of Iran"Tehran puzzled by forged 'riots' letter""Iran and its minorities: Down in the second class""Iran: Handling Of Ahvaz Unrest Could End With Televised Confessions""Bombings Rock Iran Ahead of Election""Five die in Iran ethnic clashes""Iran: Need for restraint as anniversary of unrest in Khuzestan approaches"Archived"Iranian Sunni protesters killed in clashes with security forces"Archived