GVKun编程网logo

大型XML的高效解析器(大型xml的高效解析器是什么)

8

本篇文章给大家谈谈大型XML的高效解析器,以及大型xml的高效解析器是什么的知识点,同时本文还将给你拓展AEXMLReadXMLiOSXML解析器、c#–大型XML文件,XmlDocument不可行但

本篇文章给大家谈谈大型XML的高效解析器,以及大型xml的高效解析器是什么的知识点,同时本文还将给你拓展AEXML Read XML iOS XML 解析器、c# – 大型XML文件,XmlDocument不可行但需要能够搜索、EOutOfMemory在Delphi中使用TXMLDocument解析大型XML、perl – 使用XML :: TWIG进行大型xml文件解析失败等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

大型XML的高效解析器(大型xml的高效解析器是什么)

大型XML的高效解析器(大型xml的高效解析器是什么)

我有非常大的XML文件要处理。我想将它们转换为具有颜色,边框,图像,表格和字体的可读PDF。我的机器上没有很多资源,因此,我需要我的应用程序对内存和处理器的寻址非常理想。

我进行了不起眼的研究,以使自己对所使用的技术有所了解,但是我无法确定什么是满足我的要求的最佳编程语言和API。我认为DOM不是一个选择,因为它会占用大量内存,但是带SAX解析器的Java是否可以满足我的要求?

有人还建议使用Python进行XML解析。这样好吗

非常感谢您的建议。

答案1

小编典典

SAX是非常好的解析器,但是已经过时了。

最近,Oracle启动了新的Parser来有效地解析名为 Stax* 的xml文件。 *

  • http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html *

附加的链接还将显示所有解析器的比较以及内存利用率及其功能。

谢谢,帕万

AEXML Read XML iOS XML 解析器

AEXML Read XML iOS XML 解析器

AEXML Read XML 介绍

AEXML 是简单,轻量级的 iOS XML 解析器,使用 Swift 编写。

AEXML 包括三个对象: AEXMLElement (base class), AEXMLDocument (inherited from
prevIoUs) 和 AEXMLParser (simple wrapper around NSXMLParser)。

Read XML

<?xml version="1.0" encoding="utf-8"?>
<example>
  <info>
    <name platform="iOS" language="Swift">AEXML</name>
    <url type="github">https://github.com/tadija/AEXML</url>
  </info>
  <features>
    <feature>Read XML</feature>
    <feature>Write XML</feature>
    <feature>Easy to use</feature>
  </features>
  <installation>Just drag AEXML.swift into your project and start using it.</installation>
</example>

AEXML Read XML 官网

https://github.com/tadija/AEXML

c# – 大型XML文件,XmlDocument不可行但需要能够搜索

c# – 大型XML文件,XmlDocument不可行但需要能够搜索

我正在努力使用一个合理的逻辑循环来从XML文件中剥离出太大的节点,以便与支持.NET类的XPath一起使用.

我试图用代码执行相同但使用XmTextReader替换我拥有的单行代码(使用XPath查询字符串调用SelectNodes).

我必须通过以前使用的XPath查询(仅供参考)说明几个级别:

ConfigurationRelease/Profiles/Profile[Name='MyProfileName']/Screens/Screen[Id='MyScreenId']/Settings/Setting[Name='MySettingName']

我觉得这很烦人但很简单.但是,我似乎无法让循环正确.

我需要获取一个节点,检查其下的节点以查看该值是否与目标字符串匹配,然后再向下走(如果有)或跳过该分支(如果不匹配).

事实上,我认为我的问题是,如果我没有把它分开,我不知道如何忽略一个分支.我不能允许它走不相关的分支,因为元素名称不是唯一的(如XPath查询所示).

我以为我可以保留一些布尔,例如当我点击Profile节点时,bool expectingProfileName被设置为true.但是,如果它不是我想要的特定配置文件节点,我就无法离开那个分支.

所以…希望这对某人有意义……我一直在盯着这个问题几个小时,可能只是遗漏了一些明显的东西……

我想发布一部分文件,但无法弄清楚结构的粗略程度:

Configrelease > Profiles > Profile > Name > Screens > Screen > Settings > Setting > Name

我将知道ProfileName,ScreenName和SettingName,我需要设置节点.

我试图避免在一次点击中读取整个文件,例如在应用程序启动时,因为其中一半的东西将永远不会被使用.我也无法控制生成xml文件的内容,因此无法更改它来生成多个较小的文件.

任何提示将不胜感激.

UPDATE

我重新打开了这个.一张海报建议XPathDocument应该是完美的. Unfortunatley,我没有提到这是一个移动应用程序,并且不支持XPathDocument.

大多数标准的文件并不大,这就是系统最初被编码为使用XmlDocument的原因.它目前是4MB,显然大到足以在移动应用程序加载到XmlDocument时崩溃.它可能就像它现在出现的那样,因为文件会变得更大.无论如何,我现在正在尝试DataSet建议,但仍然对其他想法持开放态度.

更新2

我有点怀疑,因为有不少人说他们不会指望这么大的文件会让系统崩溃.进一步的实验表明,这是间歇性的崩溃.昨天它每次都崩溃了,但今天早上我重置设备后,我无法重现它.我现在正试图找出一套可靠的生殖步骤.并且还决定了解决问题的最佳方法,我相信它仍然存在.我不能放弃它,因为如果应用程序无法访问此文件,它是无用的,我不认为可以告诉我的用户,当我的应用程序运行时,他们无法在他们的设备上运行任何其他内容… ….

解决方法:

看看XPathDocument.

XPathDocument比XmlDocument更轻量级,并且针对只读XPath查询进行了优化.

EOutOfMemory在Delphi中使用TXMLDocument解析大型XML

EOutOfMemory在Delphi中使用TXMLDocument解析大型XML

我有一个大的 XML文件来解析代码,如下面的示例.问题似乎是,即使childnode超出范围,分配给childnode(IXMLNode)的内存也不会被释放.一旦父TXMLDocument被取消激活(Active:= false)或释放,似乎只释放内存.所以我的代码,一旦加载了xml文档就开始大约380Mb,吹到2Gb,这就是它结束的地方.将childnode设置为nil对内存使用没有影响.

我的问题是如何显式释放分配给IXMLNode接口的内存.我不愿意使用不同的XML对象,我想我几乎已经尝试过各种方法来控制节点接口的范围.

var
  childnode: IXMLNode;

for i:=0 to rootnode.ChildNodes.Count-1 do begin
    childnode:=rootnode.ChildNodes[i];
    ...
    childnode:=nil;
end;

解决方法

我知道你说你不想要一个单独的XML库;但也许其他人想要示例代码:

var
   sax: SAXXMLReader60;
   stm: IStream;
begin
   //Get a stream around our large file
   stm := TStreamAdapter.Create(TFileStream.Create('USGovBudgetLineItems2008.xml',fmOpenRead   ));

   sax := CoSAXXMLReader60.Create;
   sax.contentHandler := TVBSAXContentHandler.Create;
   sax.parse(stm);
end;

我们用SAXContentHandler对象监听事件.

对于所有Idispatch事件,您可以返回E_NOTIMPL(msxml甚至不会调用它们).

其余的你可以插入你想要的任何代码:

TVBSAXContentHandler = class(TInterfacedobject,IVBSAXContentHandler)
protected
    { Idispatch }
    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
    function GetTypeInfo(Index,LocaleID: Integer; out TypeInfo): HResult; stdcall;
    function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount,LocaleID: Integer; dispIDs: Pointer): HResult; stdcall;
    function Invoke(dispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult,ExcepInfo,ArgErr: Pointer): HResult; stdcall;
public
    { IVBSAXContentHandler }
    procedure Set_documentLocator(const Param1: IVBSAXLocator); safecall;
    procedure startDocument; safecall;
    procedure endDocument; safecall;
    procedure startPrefixMapping(var strPrefix: WideString; var strURI: WideString); safecall;
    procedure endPrefixMapping(var strPrefix: WideString); safecall;
    procedure startElement(var strNamespaceURI: WideString; var strLocalName: WideString;
                                var strQName: WideString; const oAttributes: IVBSAXAttributes); safecall;
    procedure endElement(var strNamespaceURI: WideString; var strLocalName: WideString;
                             var strQName: WideString); safecall;
    procedure characters(var strChars: WideString); safecall;
    procedure ignorableWhitespace(var strChars: WideString); safecall;
    procedure processingInstruction(var strTarget: WideString; var strData: WideString); safecall;
    procedure skippedEntity(var strName: WideString); safecall;
//      property documentLocator: IVBSAXLocator write Set_documentLocator;
end;

Note: Any code is released into the public domain. No attribution required.

perl – 使用XML :: TWIG进行大型xml文件解析失败

perl – 使用XML :: TWIG进行大型xml文件解析失败

我正在尝试使用 XML :: Twig解析一个大的xml文件(大约100,000条记录),但perl解析失败并出现错误:

perl.exe - Application Error: 
The instruction at "0x28086920" referenced memory at "0x00000004". The memory Could not be "written"...

我读到XML :: Twig解析大型xml文件没有任何问题,但在我的情况下,它失败并出现上述错误.

我的.pl文件有一个forloop代码,可以旋转100,000次,如下所示:

foreach my $d1(@detailData)   {
    if ($d1->first_child('a')->getElementsByTagName('b')) {
        $id= $d1->first_child('a')->first_child('x')->field('b');
    }
    ....
    .....
    ......

}

在forloop里面我有大约20个如果循环如上.它是否导致内存问题?

任何人都可以建议我如何克服这些记忆问题?

解决方法

在谷歌搜索perl“内存无法写入”之后,我猜测问题来自于在内存中一次性加载文件,例如参见 http://www.perlmonks.org/?node_id=457265或(不太可能)混合使用不同编译器编译的模块(例如使用Activestate)使用Cygwin perl打包,见 http://cygwin.com/ml/cygwin/2006-12/msg00798.html).

对于XML :: Twig来处理大文件,您需要告诉它在哪个级别处理文件的各个部分(通常通过定义处理子树的处理程序,然后丢弃它),请参阅模块的文档.

今天关于大型XML的高效解析器大型xml的高效解析器是什么的讲解已经结束,谢谢您的阅读,如果想了解更多关于AEXML Read XML iOS XML 解析器、c# – 大型XML文件,XmlDocument不可行但需要能够搜索、EOutOfMemory在Delphi中使用TXMLDocument解析大型XML、perl – 使用XML :: TWIG进行大型xml文件解析失败的相关知识,请在本站搜索。

本文标签: