python解析xml,包含中文,gb2312编码。修改xml后重新写入xml有些内容怎么变了? 我的步骤如下:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python解析xml,包含中文,gb2312编码。修改xml后重新写入xml有些内容怎么变了? 我的步骤如下:相关的知识,希望对你有一定的参考价值。

解析的xml文件是gb2312编码,包含中文 用python的elementTree解析,修改xml并保存。首先用UE将gb2312编码格式转换为UTF-8(选项:ASCII转UTF-8),并把原xml文件中的encoding改为'UTF-8'。解析并写入原xml文件中,出现如下现象
(1)根节点命名空间相关的
<x:REPLACEMENT xmlns:x="urn:replace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="uurn:replace replace.xsd"> 变为 <ns0:REPLACEMENT xmlns:ns0="urn:replace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="uurn:replace replace.xsd">
这里怎么会x:变为了ns0:呢??
(2)<varValuePool></varValuePool> 变为 <varValuePool />

参考技术A 可能是python内置模块的输出是那样的,不需要用ue转,我觉得直接当文本读入内容MSG,然后解码再编码msg.decode("gb2312").encode("utf-8"),然后用正则表达式<xx>替换内容</xx>来替换内容。。。个人觉得省事些,当然要看你具体情况

通过 17gb xml 文件解析/扫描

【中文标题】通过 17gb xml 文件解析/扫描【英文标题】:parsing/scanning through a 17gb xml file 【发布时间】:2013-05-28 17:16:29 【问题描述】:

我正在尝试解析 *** 转储文件 (Posts.xml- 17gb)。格式为:

<posts>
<row Id="15228715" PostTypeId="1" />
.
<row Id="15228716" PostTypeId="2" ParentId="1600647" LastActivityDate="2013-03-05T16:13:24.897"/>
</posts>

我必须将每个问题与他们的答案“分组”。基本上找到一个问题(posttypeid=1)使用另一行的 parentId 找到它的答案并将其存储在 db 中。

我尝试使用 querypath (DOM) 执行此操作,但它一直在 exiting(139) 。我的猜测是因为文件很大,我的电脑无法处理它,即使交换空间很大。

我考虑过 xmlreader,但是当我使用 xmlreader 看到它时,程序会多次读取文件(查找问题、寻找答案、重复很多次),因此不可行。我错了吗?

还有其他方法/方式吗?

救命!

这是一次解析。

【问题讨论】:

改用SimpleXMLIterator .... @Baba 不是。见lxr.php.net/xref/PHP_TRUNK/ext/simplexml/simplexml.c#2249。它会将整个文件加载到内存中,然后对其进行迭代。 XMLReader 将遍历每个节点而不将整个文件加载到内存中,但除非您另有说明,否则它只会这样做一次。 不得不将 16 GB 中的 15 个放入交换空间然后从中读取,这很有趣。这需要几个小时。 我会考虑手动阅读文件,从一个标签到下一个标签。我在这里没有看到任何其他方式不必交换? 【参考方案1】:

使用 PHP xmlreader 似乎是正确的做法。

原因: 因为你的说法:

我必须将每个问题与他们的答案“分组”。基本上找到一个 question (posttypeid=1) 使用另一行的 parentId 找到答案 并将其存储在数据库中。

据我了解,您喜欢建立一个包含问题和答案的数据库。因此,没有理由在 XML 级别上进行“分组”。将所有相关信息放入数据库并在数据库级别进行分组 - 使用 db 命令(sql ...)。

您必须使用类似“使用目标解析器方法”之类的东西,例如 [使用xml 在 Python 中进行高性能 XML 解析(即使是用于 Python,这也是一个好的开始)。这应该可以通过 XMLReader 实现。

【讨论】:

【参考方案2】:

因为您处理这个大文件的方式不是连续的,而是需要直接访问,所以我认为唯一可行的选择是将数据加载到 XML 数据库中。

【讨论】:

同意。有时我认为人们忽略了最简单的解决方案。【参考方案3】:

我考虑过 xmlreader,但是当我使用 xmlreader 看到它时,程序会多次读取文件(查找问题、寻找答案、重复很多次),因此不可行。我错了吗?

是的,你错了。使用 XMLReader,您可以指定自己想要遍历文件的频率(您通常会执行一次一次)。对于您的情况,我认为您没有理由甚至不能在每个 &lt;row&gt; 元素上插入这个 1:1。您可以根据属性决定要插入哪个数据库(表?)。

我通常建议使用一组迭代器,使使用 XMLReader 进行遍历更容易。它被称为 XMLReaderIterator 并允许在 XMLReader 之上 foreach 以便代码通常更易于阅读和编写:

$reader = new XMLReader();
$reader->open($xmlFile);

/* @var $users XMLReaderNode[] - iterate over all <post><row> elements */
$posts = new XMLElementIterator($reader, 'row');
foreach ($posts as $post)

    $isAnswerInsteadOfQuestion = (bool)$post->getAttribute('ParentId')

    $importer = $isAnswerInsteadOfQuestion 
                ? $importerAnswers 
                : $importerQuestions;

    $importer->importRowNode($post);

如果您担心顺序(例如,您可能担心某些答案父母的答案不可用,而答案是可用的),我会在导入器层内小心,而不是在遍历内。

取决于这种情况是否经常发生,非常频繁,从不或完全不会使用不同的策略。例如。对于从不,我会直接插入到激活外键约束的数据库表中。如果经常,我会为整个导入创建一个插入事务,其中键约束被解除并在最后重新激活。

【讨论】:

感谢您的宝贵时间,您是对的,我错了。我成功地使用 xmlreader 解决了我的困境。我注意到的两件事:答案总是在问题之后(显然)并且答案出现在接下来的几千行中(很少有例外是可以的),所以编写了脚本来缓存几千个问题,寻找他们的答案,array_splice阵列的一半并重复!再次感谢 "PHP 致命错误:找不到类 'XMLElementIterator'"

以上是关于python解析xml,包含中文,gb2312编码。修改xml后重新写入xml有些内容怎么变了? 我的步骤如下:的主要内容,如果未能解决你的问题,请参考以下文章

遇到XML-GB2312网页编码的处理方法

中文字库简介,GB2312字库用法

C# XML 字符串编码问题

micropython中怎么将gb2312编码的字节流变成中文

python中文字符乱码(GB2312,GBK,GB18030相关的问题)

hibernate配置文件详细解释