COBOL XML解析等价于innerXML?
我试图访问下面示例XML中的整个“COBOL XML解析等价于innerXML?,xml,cobol,Xml,Cobol,我试图访问下面示例XML中的整个“”节点,包括开始和结束标记。我需要将XML片段作为XML存储在数据库中 <a> <mynode > <c>Content</c> <c>More content</c> </mynode > </a> XML解析在任何语言中都有点棘手。我建议为您的特定COBOL环境找到一个解析器库。简要概述XML解析领域。考虑是否需要传递XML文件一次,边传递边
<a>
<mynode >
<c>Content</c>
<c>More content</c>
</mynode >
</a>
XML解析在任何语言中都有点棘手。我建议为您的特定COBOL环境找到一个解析器库。简要概述XML解析领域。考虑是否需要传递XML文件一次,边传递边提取所需信息(SAX方法对您有效),或者是否希望将XML加载到内存并遍历其结构(希望访问DOM[文档对象模型]) 事实上,您的COBOL方言可能有
XMLParse
语句(我的旧COBOL85编译器没有)
这里有一点。在任何语言中,XML解析都有点棘手。我建议为您的特定COBOL环境找到一个解析器库。简要概述XML解析领域。考虑是否需要传递XML文件一次,边传递边提取所需信息(SAX方法对您有效),或者是否希望将XML加载到内存并遍历其结构(希望访问DOM[文档对象模型]) 事实上,您的COBOL方言可能有
XMLParse
语句(我的旧COBOL85编译器没有)
这里有一点。如果您正在使用,那么您有一个可用的语句。解析器生成事件并填充可供您访问的内容。(由于某些原因,最后一个链接不能正常工作,应该将您带到该页面上的“控制流”标记)
如果需要“删减”树结构的某些部分,包括标记和数据,那么可能需要解析原始结构,填充结构,并使用来获取所需的XML数据流。解析器似乎不会告诉您每个事件在原始XML数据流中发生的位置,至少似乎没有一个特殊的寄存器来填充该值。如果您正在使用,那么就有一个可用的语句。解析器生成事件并填充可供您访问的内容。(由于某些原因,最后一个链接不能正常工作,应该将您带到该页面上的“控制流”标记)
如果需要“删减”树结构的某些部分,包括标记和数据,那么可能需要解析原始结构,填充结构,并使用来获取所需的XML数据流。看起来解析器不会告诉您每个事件在原始XML数据流中发生的位置,至少似乎没有一个特殊的寄存器填充该值。COBOL XML PARSE不提供位置信息(AFAIK)。确定偏移位置,其中 不可能发生给定的事件。感兴趣标记的文本搜索 肯定会导致一大堆的问题-甚至不要想去那里 我能想到的下一种可能性是在解析过程中构造感兴趣的XML片段文档 原始文件。片段完成后,将其写入XML数据库
<a>
<mynode >
<c>Content</c>
<c>More content</c>
</mynode >
</a>
下面的示例程序说明了如何进行此操作。这个节目需要一段时间
XML-SOURCE文档并对其进行解析,查找感兴趣的事件(例如“b”标记)。当这样的标签
它开始构建一个片段文档(XML-fragment),直到找到结束标记。在
此时将输出片段,并开始搜索下一个片段
IDENTIFICATION DIVISION.
PROGRAM-ID. XMLTEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 XL PIC S9(4) BINARY.
01. PIC X.
88 XML-EXTRACT-NO VALUE 'N'.
88 XML-EXTRACT-YES VALUE 'Y'.
01.
05 XML-FRAGMENT PIC X(8000).
05 XML-CHARS PIC S9(4) BINARY.
01 XML-SOURCE PIC X(8000).
PROCEDURE DIVISION.
MAINLINE SECTION.
MOVE '<a><b><c>Content</c><c>More content</c></b></a>'
TO XML-SOURCE
SET XML-EXTRACT-NO TO TRUE
XML PARSE XML-SOURCE
PROCESSING PROCEDURE XTRACT
GOBACK
.
XTRACT SECTION.
COMPUTE XL = FUNCTION LENGTH (XML-TEXT)
EVALUATE XML-EVENT
WHEN 'START-OF-ELEMENT'
*
* New XML element: Ignore it, add to existing fragment
* or start a new fragment...
*
IF XML-TEXT(1:XL) = 'b' OR XML-EXTRACT-YES
IF XML-EXTRACT-NO
MOVE ZERO TO XML-CHARS
SET XML-EXTRACT-YES TO TRUE
END-IF
STRING '<' XML-TEXT(1:XL) '>' DELIMITED BY SIZE
INTO XML-FRAGMENT(XML-CHARS + 1 : XL + 2)
COMPUTE XML-CHARS = XML-CHARS + XL + 2
END-IF
WHEN 'END-OF-ELEMENT'
*
* End of event: Add to XML fragment, ignore fragment or
* output complete fragment and start search
* for a new one...
*
IF XML-EXTRACT-YES
STRING '</' XML-TEXT(1:XL) '>' DELIMITED BY SIZE
INTO XML-FRAGMENT(XML-CHARS + 1 : XL + 3)
COMPUTE XML-CHARS = XML-CHARS + XL + 3
END-IF
IF XML-TEXT(1:XL) = 'b'
*
* End of fragment write to database (or whatever)
*
DISPLAY XML-FRAGMENT(1:XML-CHARS)
SET XML-EXTRACT-NO TO TRUE
END-IF
WHEN 'CONTENT-CHARACTERS'
*
* Add event data to fragment or just ignore it...
*
* Depening on the structure of your XML docuemnt you may
* need to react to addtional EVENTS such as CDATA to ensure
* proper tag construction.
*
IF XML-EXTRACT-YES
MOVE XML-TEXT(1:XL) TO XML-FRAGMENT(XML-CHARS + 1 : XL)
COMPUTE XML-CHARS = XML-CHARS + XL
END-IF
END-EVALUATE
.
识别部门。
PROGRAM-ID.XMLTEST。
数据司。
工作和储存科。
77 XL PIC S9(4)二进制。
1图十。
88 XML-EXTRACT-NO值“N”。
88 XML-EXTRACT-YES值“Y”。
1
05 XML片段PIC X(8000)。
05 XML-CHARS PIC S9(4)二进制文件。
01 XML源PIC X(8000)。
程序司。
主线部分。
移动“内容更多内容”
到XML源代码
将XML-EXTRACT-NO设置为TRUE
XML解析XML源代码
处理程序
戈巴克
.
摘录部分。
计算XL=函数长度(XML-TEXT)
评估XML事件
当“元素的开始”
*
*新XML元素:忽略它,添加到现有片段
*或者开始一个新的片段。。。
*
如果XML-TEXT(1:XL)=“b”或XML-EXTRACT-YES
如果XML-EXTRACT-NO
将零移动到XML-CHARS
将XML-EXTRACT-YES设置为TRUE
端到端IF
由大小分隔的字符串“”
转换为XML片段(XML-CHARS+1:XL+2)
计算XML-CHARS=XML-CHARS+XL+2
端到端IF
当“元素结束时”
*
*事件结束:添加到XML片段,忽略片段或
*输出完整片段并开始搜索
*为了一个新的。。。
*
如果XML-EXTRACT-YES
s
<b><c>Content</c><c>More content</c></b>