首页 > 解决方案 > 将字符串格式化为 XML 文件

问题描述

我想将字符串重新格式化为 XML 结构,但我的字符串不是 XML 格式(使用 Python 2.7)。我相信正确的方法是首先在一行中创建输入的 XML 格式,然后使用 XML Pretty Print 使其成为具有多行和缩进的 XML 文件( Pretty printing XML in Python)。

下面是一个历史服务器 REST API 调用 Hadoop 服务器1之后的输入示例。输入:

'{"jobAttempts":{"jobAttempt":[{"nodeHttpAddress":"slave2:8042","nodeId":"slave2:39637","id":1,"startTime":1544691730439,"containerId":"container_1544631848492_0013_01_000001","logsLink":"http://23.22.43.90:19888/jobhistory/logs/slave2:39637/container_1544631848492_0013_01_000001/job_1544631848492_0013/hadoop2"}]}}' 

输出:

'<jobAttempts><jobAttempt><nodeHttpAddress>slave2:8042</nodeHttpAddress><nodeId>slave2:39637</nodeId><id>1</id><startTime>1544691730439</startTime><containerId>container_1544631848492_0013_01_000001</containerId><logsLink>http://23.22.43.90:19888/jobhistory/logs/slave2:39637/container_1544631848492_0013_01_000001/job_1544631848492_0013/hadoop2</logsLink></jobAttempt></jobAttempts>' 

最终输出

<jobAttempts>
    <jobAttempt>
        <nodeHttpAddress>slave2:8042</nodeHttpAddress>
        <nodeId>slave2:39637</nodeId>
        <id>1</id>
        <startTime>1544691730439</startTime>
        <containerId>container_1544631848492_0013_01_000001</containerId>
    <logsLink>http://23.22.43.90:19888/jobhistory/logs/slave2:39637/container_1544631848492_0013_01_000001/job_1544631848492_0013/hadoop2</logsLink>
    </jobAttempts>
</jobAttempt>

*此字符串实际上是一个 XML 文件,似乎没有任何与之关联的样式信息。

标签: regexxmlpython-2.7hadoop

解决方案


我发现 History Server REST API 的源视图确实是一行中的 XML 文件。因此,我必须阅读源视图,而不是使用 python 的旧有问题的视图。在我使用之前

import urllib2
contents = urllib2.urlopen("http://http://23.22.43.90:19888/ws/v1/history/mapreduce/jobs/job_1544631848492_0013//jobattempts").read()

现在,我正在下载带有 selenium 和 BeautifulSoup 的 html 页面的源视图,并将其保存在本地。

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import xml.dom.minidom
driver = webdriver.Firefox()
driver.get("http://23.22.43.90:19888/ws/v1/history/mapreduce/jobs/job_1544631848492_0013/jobattempts")
page_source = driver.page_source
driver.close()
soup = BeautifulSoup(page_source, "html.parser")
print(soup)
xml = xml.dom.minidom.parseString(str(soup))
pretty_xml_as_string = xml.toprettyxml()
file = open("./content_new_2.xml", 'w')
file.write(pretty_xml_as_string)
file.close()

推荐阅读