我是Delphi的新手,这就是我想做的事情。我有这样的XML文件格式,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Row>
<Designation>1234102</Designation>
<Inner>5.412</Inner>
<Outer>3.588</Outer>
<Spin>4.732</Spin>
<Cage>0.399</Cage>
</Row>
<Row>
<Designation>1342153</Designation>
<Inner>5.916</Inner>
<Outer>4.084</Outer>
<Spin>5.277</Spin>
<Cage>0.408</Cage>
</Row>
........
</Data>
我想用Delphi查询它。例如:我想要哪里的数据是1342153.什么是最好和最简单的解决方案?
提前感谢您的举例和解释。
答案 0 :(得分:3)
正如其他人所建议您可以使用XPath来查找特定值,在这种情况下,使用此表达式/Data/Row/Designation[text()="1342153"]
将在指定中找到包含值1342153的节点。
试试此示例代码
{$APPTYPE CONSOLE}
{$R *.res}
uses
MSXML,
SysUtils,
ActiveX,
ComObj;
Const
XmlStr =
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
'<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+
' <Row>'+
' <Designation>1234102</Designation>'+
' <Inner>5.412</Inner>'+
' <Outer>3.588</Outer>'+
' <Spin>4.732</Spin>'+
' <Cage>0.399</Cage>'+
' </Row>'+
' <Row>'+
' <Designation>1342153</Designation>'+
' <Inner>5.916</Inner>'+
' <Outer>4.084</Outer>'+
' <Spin>5.277</Spin>'+
' <Cage>0.408</Cage>'+
' </Row>'+
'</Data>';
procedure Test;
Var
XMLDOMDocument : IXMLDOMDocument;
XMLDOMNode : IXMLDOMNode;
begin
XMLDOMDocument:=CoDOMDocument.Create;
XMLDOMDocument.loadXML(XmlStr);
XMLDOMNode := XMLDOMDocument.selectSingleNode('/Data/Row/Designation[text()="1342153"]');
if XMLDOMNode<>nil then
Writeln('Found');
end;
begin
try
CoInitialize(nil);
try
Test;
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
答案 1 :(得分:3)
我会假设,一旦找到Designation
,您就会想要阅读其他条目(Inner
,Outer
,{{1与名称一致的。}和Spin
)。
Cage
是解决此问题的完美解决方案。我的示例使用新表单,只删除XPath
和TMemo
,并为TButton
事件添加处理程序:
Button1.OnClick
如果您只想获取所有uses
MSXML, ComObj, ActiveX;
const
XMLText = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
'<Data>' +
'<Row>' +
'<Designation>1234102</Designation>' +
'<Inner>5.412</Inner>' +
'<Outer>3.588</Outer>' +
'<Spin>4.732</Spin>' +
'<Cage>0.399</Cage>' +
'</Row>' +
'<Row>' +
'<Designation>1342153</Designation>' +
'<Inner>5.916</Inner>' +
'<Outer>4.084</Outer>' +
'<Spin>5.277</Spin>' +
'<Cage>0.408</Cage>' +
'</Row>' +
'</Data>';
procedure TForm1.Button1Click(Sender: TObject);
var
XMLDoc: IXMLDOMDocument;
Node, SibNode: IXMLDOMNode;
begin
Memo1.Clear;
XMLDoc := CoDOMDocument.Create;
XMLDoc.loadXML(XMLText);
// Select the node with the Designation you want.
Node := XMLDoc.selectSingleNode('//Designation[text()="1342153"]');
if Assigned(Node) then
begin
Memo1.Lines.Add('Found it.');
Memo1.Lines.Add(Node.nodeName + ' = ' + Node.firstChild.nodeValue);
// Read all the nodes at the same level as the Designation
SibNode := Node.nextSibling;
while SibNode <> nil do
begin
Memo1.Lines.Add(SibNode.nodeName + ' = ' +
SibNode.firstChild.nodeValue);
Sib := Sib.nextSibling;
end;
end;
end;
元素并循环显示它们包含的信息,您可以使用此功能(在上面的测试应用中添加第二个按钮,并将其用于{{1处理程序):
<Row>
答案 2 :(得分:1)
在Delphi中查询xml时,IXMLDocument和XPath是你的朋友 你可以找到很多来源,例如 XPath and TXmlDocument
答案 3 :(得分:0)
如果您想从xml查询数据,我建议您使用此处记录的XML转换http://docwiki.embarcadero.com/RADStudio/XE4/en/Converting_XML_Documents_into_Data_Packets
这会将xml映射到ClientDataSet,您可以按所需的列过滤记录,或者您可以使用DataBinding Wizard,它在此URL的文档中有解释http://docwiki.embarcadero.com/RADStudio/XE4/en/Using_the_XML_Data_Binding_Wizard
对于使用xml的其他方法,您可以在此处查看doc的主索引 http://docwiki.embarcadero.com/RADStudio/XE4/en/Working_with_XML_documents_Index