如何解析简单的xml文件

时间:2014-05-29 22:15:18

标签: rebol rebol3

>> ? xml
No information on xml

parse-xml,但在我看来,它适用于Rebol2。

我已经在rebol.org中搜索了xml个脚本,发现xml-object.r在我看来就像all次搜索中最新的一样。

我也知道altxml,但给出的例子是html

所以,如果我想解析并使用这种简化结构的+ 1GB文件的信息,我想询问我的选择:

<?xml version="1.0" encoding="Windows-1252" standalone="yes"?>
<SalesFile xmlns="urn:StandardSalesFile-1.0">
    <Header>
        <SalesFileVersion>1.01</SalesFileVersion>
        <DateCreation>2014-04-30</DateCreation>
    </Header>
    <SalesInvoices>
        <Invoice>
            <InvoiceNo>INV 1/1</InvoiceNo>
            <DocumentStatus>
                <InvoiceStatus>N</InvoiceStatus>
                <InvoiceStatusDate>2014-01-03T17:57:59</InvoiceStatusDate>
            </DocumentStatus>
        </Invoice>
        <Invoice>
            <InvoiceNo>INV 2/1</InvoiceNo>
            <DocumentStatus>
                <InvoiceStatus>N</InvoiceStatus>
                <InvoiceStatusDate>2014-01-03T17:59:12</InvoiceStatusDate>
            </DocumentStatus>
        </Invoice>
    </SalesInvoices>
</SalesFile>

Rebol3会有parse-xml工具吗?我应该使用xml-object吗?如果是这样的话?因为它仍然是我新手的语言水平。其他选择?

3 个答案:

答案 0 :(得分:2)

您真的需要将XML文件作为结构处理吗?如果没有,您是否考虑过使用PARSE?

(警告:以下是未经测试的,我只是提出了这个概念。)

Invoices: copy []

parse my-doc [
    <?xml version="1.0" encoding="Windows-1252" standalone="yes"?>

    thru <SalesFile xmlns="urn:StandardSalesFile-1.0">

    thru <Header>
        thru <SalesFileVersion> copy SalesFileVersion to </SalesFileVersion> 
        </SalesFileVersion>

        thru <DateCreation> copy DateCreation to </DateCreation>
        </DateCreation>
    thru </Header>

    thru <SalesInvoices>

    any [
        thru <Invoice>

        (Invoice: object [])

        thru <InvoiceNo> copy InvoiceNo to </InvoiceNo>
        </InvoiceNo>

        (Invoice/No: InvoiceNo)

        thru <DocumentStatus>
            thru <InvoiceStatus> copy InvoiceStatus to </InvoiceStatus>
            </InvoiceStatus>

            (Invoice/Status: InvoiceStatus)

            thru <InvoiceStatusDate> copy InvoiceStatusDate to </InvoiceStatusDate>
            </InvoiceStatusDate>

            (Invoice/StatusDate: InvoiceStatusDate)

        thru </DocumentStatus>

        thru </Invoice>
    ]

    thru </SalesInvoices>

    thru </SalesFile>

    to end
]

如果您知道自己拥有格式良好的XML,并且不希望依赖库来处理clunky-ol&#39;使用PARSE,XML,Rebol可以很清楚。作为标签!只是字符串的子类,你可以使事物看起来相对有文化。而且使用琴弦更轻巧。

虽然如果需要结构化操作,你需要一些能够制作DOM的东西。 Altxml现在是AFAIK的首选。

(嗯......我的模式copy x to <foo> <foo>的名称目前让我失望,但这是一个很好的例子。)

答案 1 :(得分:2)

Christopher Ross-Gill还有一个名为alt-xml的Rebol 3库。

http://www.ross-gill.com/page/XML_and_REBOL

这可以将XML转换为block!object!表示。

您的问题表明这些XML文件很大,可能不适合主内存。我建议创建1GB XML文件并不是最佳实践,因为许多解析器(包括此解析器)都会尝试将文件加载到内存中。

要支持这一点,您必须使用文件上的open和文件中的copy/part块自行对文件进行分块。这有点乱,但它会起作用。

使这个更干净的一种方法是根据HostileFork的建议使用解析,并在解析它时修改系列。 Parse在这方面非常灵活。

理想情况下,解析可以直接在port!个对象上工作,但这只是目前未来的愿望清单项目。

答案 2 :(得分:1)

%Rebol-Dom.r 或 %rebol-dom-mdlparser.r, 如果您愿意使用带有解析的 rebol2 来查找节点名称,然后复制一大块数据,您可以将其提供给 Rebol-Dom.r getnodename "salesInvoice" 并重复将该节点元素附加到一个块中。< /p>