xml setAttribute выдает ошибку - объект NodeList не имеет атрибута setAttribute - PullRequest
0 голосов
/ 03 июля 2019

Это меня поставило в тупик, без атрибута setAttribute. Я предполагаю, что смысл в том, что я не могу использовать setAttribute для изменения значения. Как еще я могу изменить текущее значение?

У меня есть XML-файл с данными пациента, который мне нужно изменить / изменить. Я был в состоянии изменить другие текстовые узлы без проблем. Я могу getElementsByTagName(), затем я должен использовать normalize(), проверить, что объект не равен нулю, затем я могу изменить значение с помощью firstChild.nodeValue, а затем использовать childNodes = [doc.createTextNode().

Значение, которое я пытаюсь изменить, немного отличается. Я обнаружил, что у элементов, которые я хотел изменить, сложился текстовый узел между ними: <element some data element> Похоже, что элементы, которые мне нужно изменить, имеют атрибуты: <telecom use = "HP" value = "1 (800) ...." />, но если я попробую setAttribute, он выдаст ошибку. Внутри этого элемента телекоммуникации это может быть номер телефона или адрес электронной почты. У меня уже есть код для получения правильного кода, который я модифицирую, просто сводит меня с ума, почему я могу изменить значение. И, хотя я еще не дошел до этого момента, могу поспорить, у меня будет еще одна проблема при записи этого модифицированного XML-файла в файл. (Просто размышляя вслух, пока ничего действительно не пошло, проблема сейчас в setAttribute)

это фрагмент XML-файла:

author>
    <time value="20190211160404-0700" />
    <assignedAuthor>
      <id root="2.16.840.9.9.9.99999" extension="99999999999" />
      <addr use="HP">
        <streetAddressLine>Urgent Care Clinic</streetAddressLine>
        <streetAddressLine>123 Anywhere Lane</streetAddressLine>
        <city>Denver</city>
        <state>CO</state>
        <postalCode>80000</postalCode>
      </addr>
      <telecom use="UP" value="tel:+1(800)999-4040" />
      <assignedPerson>
        <name>
          <given>Test</given>
          <family>Patient</family>
          <suffix>FG</suffix>
        </name>
      </assignedPerson>
      <representedOrganization>
        <id root="2.16.840.1.999999.0.999.99999" />
        <name>Urgent Care Clinic</name>
        <telecom value="mailto:johnwayne@dukes.edu" />
      </representedOrganization>
    </assignedAuthor>
  </

Код:

#This is how I have been modifying the attributes

for zipcode in doc.getElementsByTagName("postalCode"):
    if zipcode.firstChild is not None:
     zipcode.normalize()
     zipcode.firstChild.nodeValue = "80224"
     zipcode.childNodes = [doc.createTextNode("80224")]
    else:
     nodelist = doc.getElementsByTagName("postalCode").length 

#These approaches fail
for telecom in doc.getElementsByTagName("telecom"):
    phone = telecom.getAttribute("value")
    if telecom.firstChild is not None:
     telecom.normalize()
    if phone[0:4] in ["mail"]:  
    #phone.setAttribute("value", "anon@anon.com")
    #doc.getElementsByTagName("telecom").setAttribute("value", "anon@anon.com")
    phone.firstChild,nodeValue = "anon@anon.com"
    phone.childNodes = [doc.createTextNode("anon@anon.com")]

Я ожидаю, что значение телекоммуникации будет изменено. Если это не текстовый узел или атрибут, что это такое и как я могу изменить его значение? Когда я использую phone.setAttribute("value", "anon@anon.com"), я ожидаю, что значение телекоммуникации изменится с: <telecom value="mailto:johnwayne@dukes.edu" /> до <telecom value="mailto:anon@anon.com" /> Вместо этого я вижу ошибку:

AttributeError: объект str не имеет атрибута setAttribute при использовании phone.setAttribute()

и когда я пытаюсь doc.getElementsByTagName("telecom").setAttribute("value", "anon@anon.com"), Я получаю ту же ошибку с небольшим поворотом,

объект nodeList не имеет атрибута setAttribute

...