Xml 复印及;“复制”无法正确使用stringlist

Xml 复印及;“复制”无法正确使用stringlist,xml,delphi,delphi-xe3,tstringlist,Xml,Delphi,Delphi Xe3,Tstringlist,我得到了一个大的xml文件,我想将每个id、源和目标保存在一个stringlist中,以便在成功导入stringlist后生成,并构建一个mysql查询 以下是我的xml的一个片段: xliff version="1.1"> <file original="Xliff Demo" source-language="EN" target-language="DE" datatype="html"> <header> <skl> <extern

我得到了一个大的xml文件,我想将每个id、源和目标保存在一个stringlist中,以便在成功导入stringlist后生成,并构建一个mysql查询

以下是我的xml的一个片段:

xliff version="1.1">
 <file original="Xliff Demo" source-language="EN" target-language="DE" datatype="html">
 <header>
 <skl>
 <external-file uid="017dbcf0-c82c-11e2-ba2b-005056c00008" href="skl\simple.htm.skl"/>
 </skl>
 </header>
 <body>
 <trans-unit id="00ffmnpB5wBV5KFqBxuHLi4fwJvvuB">
 <source xml:lang="EN">1lnRUfBBeHtbS96uULSht42VNMN7XE4qt9JrOcWhtoTuhnbAQ9</source>
 <target xml:lang="DE">zZvOLJfLCy9oP5GQYfEqw5LAeC2ESAxRmVe1JyQdmJ1eG2jz1N</target>
 <note/></trans-unit>
 <trans-unit id="00kjUwy1rJ54bEGYp7XZvtBiY32pmj">
 <source xml:lang="EN">HXOQLUWkfJg206vRw8lyWhCWChOacVxbMukfQ0HUdNHSI18GG4</source>
 <target xml:lang="DE">8dsX38mezeZ0w0w37LI66CDRuI8gBD23zT5KR4iqYNv3IGUgH0</target>
 <note/></trans-unit>
 <trans-unit id="00kk3Af8SFpHyelAaYrgK58b9GbIDj">
 <source xml:lang="EN">wQFxZiCiRsSNWs20G4WXAmDBRdRL6fcrrJnCgtbiXGSfHzpYrT</source>
 <target xml:lang="DE">oFVTUdPkExOhISYofIImLsnVKd3NSZg32tyeP5iRxRZdmuYQDy</target>
 <note/></trans-unit>
 <trans-unit id="00Ky2dmDU9wGTWBnJxeL9b9gkts5UQ">
 <source xml:lang="EN">nHQcjAW02lWe0SyOhqGtyqUhpwQ8qgWX3rUynMRf4BDHfVdHOC</source>
 <target xml:lang="DE">0CURp1dcZydB1V2rEZ1lnOhmYufOYbrLbh84e1ZnALlzZPVq4F</target>
 <note/></trans-unit>
 <trans-unit id="00pMSFlBfA3bJ8Xy9I78wz6XisPYcV">
 <source xml:lang="EN">IuhtaVnZtF67nxKz5dbmuy8BEMTs2X1120FzDtIplKF2Me5AsQ</source>
 <target xml:lang="DE">1BGSJQDZBm4UW974pucnX3XHuYOQYpC7nTcIH01rbKlOkVi9bo</target>
 <note/></trans-unit>
 <trans-unit id="012w2kb2d1Lo6NbJLE0BawThzsSuCJ">
 <source xml:lang="EN">0RoniOGZ7V7WTF1YQg59B8jBhRxnLVXscC1LOGPzKPYRs76oIz</source>
 <target xml:lang="DE">gyw15fkHTni2aUGWI5qiPHEz8vsJJJsW4OOqKwGYL1qzfUVfLO</target>
 <note/></trans-unit>
...
..
..
xliff version=“1.1”>
1LNRUBBEHTBS96UULSHT42VNMN7Xe4QT9JROCWTOTUHNBAQ9
ZZVOLJFLCY9OP5GQYFEW5LAEC2SAXRMVE1JYQDMJ1EG2JZ1N
HXOQLUWkfJg206vRw8lyWhCWChOacVxbMukfQ0HUdNHSI18GG4
8DSX38MEZEZ0W0W37LI66CDRUI8GBD23ZT5KR4IQYNV3IGH0
WQFxZiCirSSNWS20G4WxAMDBRRDRL6FCRRJNCGTBIXGSFHZpyrt
VTUDPKExoHisiyoFiimlsNVKD3NSZG32TYEP5IRXRZDMUYQDY
nHQcjAW02lWe0SyOhqGtyqUhpwQ8qgWX3rUynMRf4BDHfVdHOC
0CURP1DCZYDB1V2REZ1LNOHMYUFYBRLBH84E1ZNALLZZPVQ4F
IuhtaVnZtF67nxKz5dbmuy8BEMTs2X1120FzDtIplKF2Me5AsQ
1BGSJQDZBm4UW974pucnX3XHuYOQYpC7nTcIH01rbKlOkVi9bo
0RONIOGZ7V7WTF1YQG59B8JBHRXNLVXSCCC1LOGPZKPYRS76OIZ
gyw15fkHTni2aUGWI5qiPHEz8vsJJJsW4OOqKwGYL1qzfUVfLO
...
..
..
因此,我尝试将trans-unitid、source-xml:lang“EN”、target-xml:lang=“DE”的每个条目保存在一个单独的字符串列表中,但只保存值

这是我的密码:

{ -----------  Import Procedure ------------ }
procedure TForm2.Button2Click(Sender: TObject);
var
  xmlFile, idList, sourceList, targetList: TStringList; // StringListe wo die Xml Datei eingelesen wird
  i: Integer;
  id, source, target: String;
  idTmp, idTmp2, sourceTmp, sourceTmp2, targetTmp, targetTmp2: Integer;
begin
  try
    xmlFile := TStringList.Create;
    idList := TStringList.Create;
    sourceList := TStringList.Create;
    targetList := TStringList.Create;

    if OpenDialog1.Execute then
      xmlFile.LoadFromFile(OpenDialog1.FileName);

      {Debug}
        //ShowMessage(IntToStr(XmlFile.Count));   Ausgabe der Zeilenlänge
        //ShowMessage(XmlFile[8]);                // Ausgabe der Zeile 8
      {/Debug}

      for i := 0 to xmlFile.Count-1 do // Über alle Zeilen der StringList gehen und folgendes tun:
        begin // Code pro Zeile

          {id}
          idTmp  := Pos('<trans-unit id="', xmlFile.Strings[i])+16;  //  Sucht nach trans-unit id   (16 ist die Anzahl der Länge vom Suchstring in dem Fall trans-unit id 16 Stellen lang
          if idTmp > 5 then // Überprüfen ob was gefunden wurde (Ungleich 0)
          begin
            idTmp2 := Pos('"', xmlFile.Strings[i], idTmp); // Ermittelt die Position vom Ende des Strings (")
            idList.Add(Copy(xmlFile.Strings[i], idTmp, idTmp2-idTmp));
          end;

          {source}
          sourceTmp  := Pos('<source xml:lang="EN">', xmlFile.Strings[i])+22;
          if sourceTmp > 5 then // Überprüfen ob was gefunden wurde (Ungleich 0)
          begin
            sourceTmp2 := Pos('<', xmlFile.Strings[i], sourceTmp); // Ermittelt die Position vom Ende des Strings (")
            sourceList.Add(Copy(xmlFile.Strings[i], sourceTmp, sourceTmp2-sourceTmp));
          end;

          {target}
          targetTmp  := Pos('<target xml:lang="DE">', xmlFile.Strings[i])+22;
          if targetTmp > 5 then // Überprüfen ob was gefunden wurde (Ungleich 0)
          begin
            targetTmp2 := Pos('<', xmlFile.Strings[i], targetTmp); // Ermittelt die Position vom Ende des Strings (")
            targetList.Add(Copy(xmlFile.Strings[i], targetTmp, targetTmp2-targetTmp));
          end;
        end;

      StartPerformance;
      UniConnection1.Open;
  finally
    ListBox1.items.assign(idList);
    ListBox2.items.assign(sourceList);
    ListBox3.items.assign(targetList);
    ShowMessage('Import in StringListen fertiggestellt.');
    xmlFile.Free;
    idList.Free;
    sourceList.Free;;
    targetList.Free;
  end;
end;
{------------导入过程----------------}
程序TForm2.按钮2单击(发件人:ToObject);
变量
xmlFile、idList、sourceList、targetList:TStringList;//StringListe和Xml数据
i:整数;
id、源、目标:字符串;
idTmp,idTmp2,sourceTmp,sourceTmp2,targetTmp,targetTmp2:整数;
开始
尝试
xmlFile:=TStringList.Create;
idList:=TStringList.Create;
sourceList:=TStringList.Create;
targetList:=TStringList.Create;
如果是OpenDialog1.Execute,那么
LoadFromFile(OpenDialog1.FileName);
{Debug}
//ShowMessage(IntToStr(XmlFile.Count));泽伦格酒店
//ShowMessage(XmlFile[8]);//奥斯加贝德泽勒8号酒店
{/Debug}
对于i:=0到xmlFile.Count-1 do//
开始//代码专业版
{id}

idTmp:=Pos(“也许您应该考虑使用接口将XML文件加载到数据结构中,然后填充字符串列表

这里发布了一个示例:

这里:

idTmp  := Pos('<trans-unit id="', xmlFile.Strings[i])+16;  
if idTmp > 5 then 
  ...
其他两个区块的变化将以类似的方式进行

您会注意到我在这里为
idTmp2
使用了StrUtils.PosEx-我不知道您的代码是如何为第二个函数使用Pos编译的

编辑

好的,看起来Pos在XE3中被更改为包含偏移量重载。如果性能是您的目标(从评论中可以看出),您可能应该阅读以下内容:

此外,我认为这可能非常重要,这确实是一种糟糕的XML解析方法。我强烈建议您阅读一些已经这样做的项目的源代码,以便更好地理解应该如何解决问题。一些示例可能是:


我仍然知道这个组件的存在。但是我应该使用自己的函数来读取这些组件并导入。@多态-有什么原因吗?我想区分导入速度,有没有和自己的函数。@多态-这可能很有趣,然后:@多态-是的,zip脱机,但有很好的性能集合数据(还有一些好的库可以尝试)如果您对比较XML库的速度感兴趣。除非您真的需要自定义算法的最大性能,否则通常我认为使用一个好的库总是更好的选择。它通常比定制的解决方案更稳定、更健壮。如果idTmp>5
和sim,它已经是第一个
ilar永远都是真实的不,这不是解析XML的方式。永远不要尝试自己解析XML。请看这里的原因:@J…代码中的方法并不比正则表达式好。看看代码,首先我看不到标记器。bobince的开创性答案的情感同样适用于这里。@Jeroenviertplumers-当然,我同意。我想是bes类比是玩弄汽油还是玩semtex。虽然这两种方法都是不明智的,但两种临时方法中较小的一种,由于其自身的笨拙性,在其作者意识到这种方法的无效性之前,通常在怪物的程度上至少更具自限性。然而,我完全承认,我可能严重低估了这种方法与决心坚定的疯子可能将上述内容发展成百万行程序的决心相匹配。请注意,这样您就不能再访问
qc.embarcadero.com
链接了。如果您需要访问旧的qc数据,请查看。
 idTmp  := Pos('<trans-unit id="', xmlFile.Strings[i]);  
 if idTmp > 0 then begin //Pos returns 0 if no match found
   idTmp := idTmp + 16;
   idTmp2 := PosEx('"', xmlFile.Strings[i], idTmp); 
   idList.Add(Copy(xmlFile.Strings[i], idTmp, idTmp2-idTmp));
 end;