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

          Thal And Out Agency railway station See also References External links Navigation menuOfficial Web Site of Pakistan RailwaysArchivedOfficial Web Site of Pakistan Railwayseeexpanding ite

          Posting a File and Associated Data to a RESTful WebService preferably as JSON2019 Community Moderator ElectionREST URI convention - Singular or plural name of resource while creating itUploading both data and files in one form using Ajax?How do I upload a file with metadata using a REST web service?REST API - file (ie images) processing - best practicesSpring: JSON data and file in the same requestREST API Put large dataPosting a file and JSON data to Spring rest serviceRESTful Web Service Upload/Download Large Data With JSONREST API Design sending JSON data and a file to the api in same requestPost JSONArray to REST servicePUT vs. POST in RESTParsing values from a JSON file?JavaScript/jQuery to download file via POST with JSON dataHow do I upload a file with metadata using a REST web service?How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?Separate REST JSON API server and client?what's the correct way to send a file from REST web service to client?How do I write JSON data to a file?What is “406-Not Acceptable Response” in HTTP?REST API - file (ie images) processing - best practices

          How can I change the color of pagination dots of UIPageControl?How to change UIPageControl dotsIs there a way to change page indicator dots colorCustomize dot with image of UIPageControl at index 0 of UIPageControlNo visible @interface for 'NSObject<PageControlDelegate>' declares the selector 'pageControlPageDidChange:'How to change the color of pagination dots in UIPageControl with a different color per pagepagecontrol indicator custom image instead of DefaultChanging the colour of UIPageControl dots in MonoTouchpagecontrol selectable page visibility color?Alternative way to load ViewControllers on a UIPageControlHow to set only layer.border-color for UIpage control dots in swiftHow can I develop for iPhone using a Windows development machine?How to change the name of an iOS app?UITableView - change section header coloruipagecontrol indicator(dot)issueCustom UIPageControl dots color not changingchange the interspace between UIPageControl dotsHow to change Status Bar text color in iOSHow can I change image tintColor in iOS and WatchKitUIPageControl dots with larger space in between each dotsHow to change the color of pagination dots in UIPageControl with a different color per page