我并不知道有什么区别,但是一位同事说有,尽管他无法支持.有什么区别?
我使用PHP库生成XML,如下所示:
$dom = new DOMDocument("1.0","utf-8");
Run Code Online (Sandbox Code Playgroud)
执行上述操作会在页面中显示输出顶部的消息.
此页面包含以下错误:第274行第274505行的错误:PCDATA无效字符值27下面是第一个错误之前的页面呈现.
我尝试使用Tidy库进行纠正..使用iconv来获取UTF-8中的中文字符.
我试图以一种内存有效的方式解析一个带有lxml的巨大xml文件(即从磁盘懒洋洋地流式传输,而不是将整个文件加载到内存中).不幸的是,该文件包含一些破坏默认解析器的坏ascii字符.如果我设置recover = True,则解析器可以工作,但是iterparse方法不会使用recover参数或自定义解析器对象.有谁知道如何使用iterparse来解析破碎的xml?
#this works, but loads the whole file into memory
parser = lxml.etree.XMLParser(recover=True) #recovers from bad characters.
tree = lxml.etree.parse(filename, parser)
#how do I do the equivalent with iterparse? (using iterparse so the file can be streamed lazily from disk)
context = lxml.etree.iterparse(filename, tag='RECORD')
#record contains 6 elements that I need to extract the text from
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
编辑 - 以下是我遇到的编码错误类型的示例:
In [17]: data
Out[17]: '\t<articletext><p>The cafeteria rang with excited voices. Our barbershop quartet, The Bell \r Tones was …Run Code Online (Sandbox Code Playgroud) 我从第三方获得了一个我必须在我的应用程序中导入的XML文件,并且XML具有未转义和内部文本的元素,并且他们不会解决这个问题!所以我的问题是处理这个问题的最佳方法是什么?
这个XML非常大,而且修复速度必须很快,我的第一个解决方案就是用&符替换&字符,但实际上我不喜欢这个"解决方案",原因很明显.我不知道如何使用XmlStringReader与这样的XML,因为在这样的行上抛出异常,所以我不能在内部文本上使用HtmlEncode.我试图将XmlTextReader设置Settings.CheckCharacters为false但没有结果.
这是示例,&是元素,并且在该字段中可以是某些公司名称中的任何内容,因此我的替换修复可能不适用于其他公司名称,我想以某种方式使用HtmlEncode,但仅限关于内在文本当然.
<komitent ID="001398">
<sifra>001398</sifra>
<redni_broj>001398</redni_broj>
<naziv>LJUBICA & ŽARKO</naziv>
<adresa1>Odvrtnica 27</adresa1>
<adresa2></adresa2>
<drzava>HRVATSKA</drzava>
<grad>Zagreb</grad>
</komitent>
Run Code Online (Sandbox Code Playgroud) 我一直在研究解析外部XML文件的代码.其中一些文件非常庞大,高达千兆字节的数据.毋庸置疑,这些文件需要作为流进行解析,因为将它们加载到内存中效率太低,并且经常导致OutOfMemory问题.
我使用了库miniDOM,ElementTree,cElementTree,我目前正在使用lxml.现在我有一个工作的,非常有效的内存脚本,使用lxml.etree.iterparse.问题是我需要解析的一些XML文件包含编码错误(它们通告为UTF-8,但包含不同编码的字符).使用lxml.etree.parse此功能时,可以使用recover=True自定义解析器选项进行修复,但iterparse不接受自定义解析器.(另见:这个问题)
我当前的代码如下所示:
from lxml import etree
events = ("start", "end")
context = etree.iterparse(xmlfile, events=events)
event, root_element = context.next() # <items>
for action, element in context:
if action == 'end' and element.tag == 'item':
# <parse>
root_element.clear()
Run Code Online (Sandbox Code Playgroud)
iterparse遇到错误字符时出错(在这种情况下,它是a ^Y):
lxml.etree.XMLSyntaxError: Input is not proper UTF-8, indicate encoding !
Bytes: 0x19 0x73 0x20 0x65, line 949490, column 25
Run Code Online (Sandbox Code Playgroud)
我甚至不想解码这些数据,我可以放弃它.不过,我不知道有什么办法跳过元素-我想context.next和continue中试/ except语句.
任何帮助,将不胜感激!
更新
一些额外的信息:这是iterparse失败的行:
<description><![CDATA:[musea de …
我必须使用XML文件,但我没有得到所有项目,因为我的导航器中显示的此错误在文件内容之前.确切的错误是:
此页面包含以下错误:
第10行第4099行的错误:PCDATA无效字符值11以下是直到第一个错误的页面呈现.
我该怎么办 ?谢谢你的建议.
我有一个进程使用JDOM和xpath解析XML文件来解析文件,如下所示:
private static SAXBuilder builder = null;
private static Document doc = null;
private static XPath xpathInstance = null;
builder = new SAXBuilder();
Text list = null;
try {
doc = builder.build(new StringReader(xmldocument));
} catch (JDOMException e) {
throw new Exception(e);
}
try {
xpathInstance = XPath.newInstance("//book[author='Neal Stephenson']/title/text()");
list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
throw new Exception(e);
}
Run Code Online (Sandbox Code Playgroud)
以上工作正常.xpath表达式存储在属性文件中,因此可以随时更改这些表达式.现在我必须处理更多来自遗留系统的xml文件,该系统只会以4000字节的块发送xml文件.现有处理读取4000字节块并将它们存储在Oracle数据库中,每个块作为数据库中的一行(对遗留系统进行任何更改或将块存储为数据库中的行的处理是不可能的) .
我可以通过提取与特定xml文档相关的所有行并合并它们然后使用现有处理(如上所示)来解析xml文档来构建完整的有效XML文档.
但事实是,我需要从XML文档中提取的数据始终位于前4000个字节上.这个大块的课程不是一个有效的XML文档,因为它不完整但会包含我需要的所有数据.由于JDOM构建器拒绝它,我无法解析一个块.
我想知道我是否可以解析格式错误的XML块而不必合并所有部分(可能会有很多部分)以获得有效的XML文档.这将节省我几次到数据库的行程,以检查一个块是否可用,并且我不必合并100个块只是为了能够使用前4000个字节.
我知道我可能会使用java的字符串函数来提取相关数据但这可能是使用解析器甚至xpath吗?或者他们都希望xml文档在解析之前是一个格式良好的文档?
我正在解析从网站返回的XML,但遗憾的是它的格式有些不正确。我得到像这样的XML:
<tag attrib="Buy two for £1" />
Run Code Online (Sandbox Code Playgroud)
我被告知这是无效的,因为£它是HTML字符,而不是XML字符,并且绝对不能出现在属性中。
假设我无法告诉网站遵守规则,该怎么办?我正在考虑使用a FilterInputStream过滤到达的数据,然后再到达SAX解析器,但这似乎是最重要的。
我正在处理由perl生成的格式错误的XML,这是由我无法改变的上游进程生成的(这似乎是一个常见的问题).但是,据我所见,XML只有一种特殊的方式格式错误:它的属性值包含未转义的小于号,例如:
<tag v="< 2">
Run Code Online (Sandbox Code Playgroud)
我正在使用带有XML :: LibXML的 perl 进行解析,当然,这会生成解析错误.我已经尝试使用recover选项,它允许我解析,但它只是在遇到第一个解析错误时停止,所以我正在以这种方式丢失数据.
看起来我有两个一般的选择:
我倾向于选项1,因为我想捕获XML的任何其他错误.你会推荐什么?如果#1,有人可以引导我通过正则表达式方法吗?
我有这个游乐场:https://go.dev/play/p/uEpYEWaQaV0 但不明白问题是什么以及为什么它不起作用!我收到错误:
invalid character entity &ccb
Run Code Online (Sandbox Code Playgroud)
我的代码是:
package main
import (
"encoding/xml"
"fmt"
)
type catalog struct {
Id string `xml:"id"`
}
type price struct {
Subtotal int `xml:"subtotal"`
Currency string `xml:"currency"`
Total int `xml:"total"`
PriceStatus string `xml:"price_status"`
}
type image struct {
Url string `xml:"url"`
Id int `xml:"id"`
}
type product struct {
Id int `xml:"id"`
RetailerId int `xml:"retailer_id"`
Image image `xml:"image"`
Price int `xml:"price"`
Currency string `xml:"currency"`
Name string `xml:"name"`
Quantity int `xml:"quantity"`
}
type order struct …Run Code Online (Sandbox Code Playgroud) 我正在尝试解析一些无效的xml,因为属性不在引号中,有没有办法解决这个问题?下面是一个简单的例子,以及java代码.
XML
<car id=1>
.
.
</car>
Run Code Online (Sandbox Code Playgroud)
Java的
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(page, handler); //page is an input stream where the xml is.
Run Code Online (Sandbox Code Playgroud)
谢谢.