gpt4 book ai didi

xml - 在 Delphi XE2 中解析 XML 时出现访问冲突

转载 作者:行者123 更新时间:2023-12-01 17:48:00 33 4
gpt4 key购买 nike

我正在尝试使用以下代码在 Delphi XE2 中解析 MusicBraninz XML 文件:

webquery := 'http://www.musicbrainz.org/ws/2/recording/?query='+escape(tracktitle)+'&artist:'+escape(ArtistTitle);

Log('WebQuery: ' + webquery, 0);

begin
XMLDoc:= TXMLDocument.Create(nil);
XMLDoc.FileName := webQuery;
XMLDoc.Active := True;

Log('Report: ' + XMLDoc.XML.Text, 0);


StartItemNode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('release-list') ;

ANode := StartItemNode;
repeat
Result.Album := ANode.ChildNodes['title'].Text; <-- Access Violation
Result.Status:= ANode.ChildNodes['status'].Text;

ANode := ANode.NextSibling;
until ANode = nil;

end;

XML 文件已正确获取,如下所示:

<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0">
<recording-list offset="0" count="1">
<recording ext:score="100" id="a399eec1-d45d-4505-b475-ead0da6cad17">
<title>Mestecăniș</title>
<length>359000</length>
<artist-credit>
<name-credit>
<artist id="8fb78a16-0cba-4175-8c92-d9645dfb007d">
<name>Bucovina</name>
<sort-name>Bucovina</sort-name>
</artist>
</name-credit>
</artist-credit>
<release-list>
<release id="22b00afc-86ea-445a-8805-b6bfa33da74e">
<title>Duh</title>
<status>Official</status>
<release-group type="EP" id="4e8fb87c-3760-48c1-a3d7-88e7a2c839fa">
<primary-type>EP</primary-type>
</release-group>
<date>2010</date>
<country>RO</country>
<medium-list>
<track-count>5</track-count>
<medium>
<position>1</position>
<format>CD</format>
<track-list offset="3" count="5">
<track>
<number>4</number>
<title>Mestecăniș</title>
<length>359000</length>
</track>
</track-list>
</medium>
</medium-list>
</release>
</release-list>
</recording>
</recording-list>
</metadata>

我的问题是:我在这里做错了什么吗?所有变量都已声明并初始化完毕。

谢谢

最佳答案

您遇到访问冲突,因为 FindNode 方法返回 nil 值,并且您正在尝试访问无效的内存位置。为了使用 FindNode 方法,您必须检查要搜索的节点的层次结构(级别),然后检查结果是否不 nil

尝试这个示例。

  XMLDoc:= LoadXMLDocument(webQuery);
StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('recording-list');
if not Assigned(StartItemNode) then exit;
StartItemNode := StartItemNode.ChildNodes.FindNode('recording');
if Assigned(StartItemNode) then
begin
StartItemNode := StartItemNode.ChildNodes.FindNode('release-list');
if Assigned(StartItemNode) then
begin
StartItemNode := StartItemNode.ChildNodes.FindNode('release');
if Assigned(StartItemNode) then
begin
ANode := StartItemNode;
repeat
Result.Album := ANode.ChildNodes['title'].Text;
Result.Status:= ANode.ChildNodes['status'].Text;
ANode := ANode.NextSibling;
until ANode = nil;
end;
end;
end;

关于xml - 在 Delphi XE2 中解析 XML 时出现访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12759717/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com