Есть ли способ передать параметры в XML?Или изменить его? - PullRequest
0 голосов
/ 03 января 2019

Я хотел бы передать определенный параметр в xml, поэтому вместо того, чтобы быть необработанным xml со всеми значениями при его создании, я бы хотел изменить один с параметром (например, пользовательский ввод).

В идеале я искал что-то вроде <title> &param1 </title> и позже смог бы передать любой желаемый параметр, но, думаю, это невозможно.

Поэтому, как нельзя передать параметр (или, по крайней мере, из того, что я искал), я подумал о редактировании XML после его создания.

Я искал в основном с BeautifulSoup, потому что это то, что я хочу использовать (и что я использую).Это всего лишь немного моего проекта.например это и это - некоторые из моих исследований).

Итак, эту функцию я пытаюсь сделать: у нас есть xml, мы находим часть, которую хотим редактировать, и редактируем ее (я знаю, что для доступа к ней она должна быть целым числом pruebaEdit[anyString] неверно.

def editXMLTest():
    editTest="""<?xml version="1.0" ?>
<books>
  <book>
    <title>moon</title>
    <author>louis</author>
    <price>8.50</price>
  </book>
</books>
    """
    soup =BeautifulSoup(editTest)
    for tag in soup.find_all('title'):
        print (tag.string, '\n')
        #tag.string='invented title'
        editTest[tag]='invented title' #I know it has to be an integer, not a string
    print()
    print(editTest)

Мой ожидаемый вывод должен быть в формате xml: <title>invented title</title> вместо <title>moon</title>.

Редактировать: добавлено это вмое исследование

Ответы [ 4 ]

0 голосов
/ 03 января 2019

С Python lxml, который может запускать сценарии XSLT 1.0, а также механизм синтаксического анализа для BeautifulSoup, вы можете передавать параметры для изменения файлов XML по мере необходимости. Просто установите <xsl:param> в скрипте XSLT и в Python передать значение через strparam:

XSLT (сохранить как файл .xsl, специальный файл .xml)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" omit_xml_declaration="no"/>
  <xsl:strip-space elements="*"/>

  <!-- INITIALIZE PARAMETER -->
  <xsl:param name="new_title" /> 

  <!-- IDENTITY TRANSFORM -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- REWRITE TITLE TEXT -->
  <xsl:template match="title">
    <xsl:copy>
      <xsl:value-of select="$new_title"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Python (см. Вывод ниже как комментарий)

import lxml.etree as et

txt = '''<books>
           <book>
               <title>moon</title>
               <author>louis</author>
               <price>8.50</price>
             </book>
         </books>'''

# LOAD XSL SCRIPT
xml = et.fromstring(txt)
xsl = et.parse('/path/to/XSLTScript.xsl')
transform = et.XSLT(xsl)

# PASS PARAMETER TO XSLT
n = et.XSLT.strparam('invented title')
result = transform(doc, new_title=n)

print(result)
# <?xml version="1.0"?>
# <books>
#   <book>
#     <title>invented title</title>
#     <author>louis</author>
#     <price>8.50</price>
#   </book>
# </books>

# SAVE XML TO FILE
with open('Output.xml', 'wb') as f:
    f.write(result)

Демонстрация Pyfiddle (обязательно нажмите Run и проверьте вывод)

0 голосов
/ 03 января 2019

вы должны распечатать результаты или soup не оригинальная строка editTest

for tag in soup.find_all('title'):
    print (tag.string, '\n')
    tag.string='invented title'
print(soup)
0 голосов
/ 03 января 2019

Использование ссылок на сущности, таких как &param;, является самой близкой вещью, доступной в самом XML, но это не очень гибко, потому что расширения сущностей определяются в файле DTD, а не передаются программно в синтаксический анализатор XML. Некоторые парсеры (я не знаю ситуацию с Python) позволяют вам предоставлять EntityResolver, который может программно разрешать ссылки на сущности, но это не будет моим первым выбором.

Конечно, существуют языки шаблонов, которые позволяют создавать XML программно. XSLT - самый очевидный выбор; это, вероятно, делает гораздо больше, чем нужно, но это не обязательно недостаток. Некоторые другие опции перечислены в https://en.wikipedia.org/wiki/Comparison_of_web_template_engines - включая несколько для среды Python. К сожалению, многие из этих инструментов, по моему опыту, не особенно хорошо документированы и не поддерживаются, поэтому внимательно изучите их.

0 голосов
/ 03 января 2019

Используйте тег <xsl> для передачи параметра в xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...