Как извлечь внутренний текст и XML узла в виде строки? - PullRequest
2 голосов
/ 08 июля 2020

У меня следующая структура XML:

<?xml version="1.0"?>
<main>
  <node1>
    <subnode1>
      <value1>101</value1>
      <value2>102</value2> 
      <value3>103</value3> 
    </subnode1>
    <subnode2>
      <value1>501</value1>
      <value2>502</value2> 
      <value3>503</value3> 
    </subnode2>
  </node1>
</main>

В Delphi Я ищу функцию, которая возвращает внутренний текст и XML узла в виде строки. Например, для <node1> строка должна быть (если возможно, включая отступы и разрывы строк):

    <subnode1>
      <value1>101</value1>
      <value2>102</value2> 
      <value3>103</value3> 
    </subnode1>
    <subnode2>
      <value1>501</value1>
      <value2>502</value2> 
      <value3>503</value3> 
    </subnode2>

Я не могу найти такую ​​функцию в Delphi 10.

Есть ли такая функция?

Или как лучше всего реализовать ее в Delphi 10?

Ответы [ 2 ]

5 голосов
/ 09 июля 2020

правильный способ справиться с этим - использовать фактическую XML библиотеку, например собственный Delphi компонент TXMLDocument или IXMLDocument интерфейс (или любое количество сторонних XML библиотек, доступных для Delphi). Вы можете загрузить в него свой XML, затем найти IXMLNode для элемента <node1> (или любого другого элемента, который вы хотите), а затем прочитать его свойство XML по мере необходимости.

Например:

uses
  ..., Xml.XMLIntf, Xml.XMLDoc;

var
  XML: DOMString;
  Doc: IXMLDocument;
  Node: IXMLNode;
begin
  XML := '<?xml version="1.0"?><main><node1>...</node1></main>';
  Doc := LoadXMLData(XML);
  Node := Doc.DocumentElement; // <main>
  Node := Node.ChildNodes['node1'];
  XML := Node.XML;
  ShowMessage(XML);
end;

Или:

uses
  ..., Xml.XMLIntf, Xml.xmldom, Xml.XMLDoc;

var
  XML: DOMString;
  Doc: IXMLDocument;
  Node: IXMLNode;
  XPath: IDOMNodeSelect;
  domNode: IDOMNode;
begin
  XML := '<?xml version="1.0"?><main><node1>...</node1></main>';
  Doc := LoadXMLData(XML);
  XPath := Doc.DocumentElement.DOMNode as IDOMNodeSelect;
  domNode := XPath.selectNode('/main/node1');
  Result := TXMLNode.Create(domNode, nil, (Doc as IXmlDocumentAccess).DocumentObject);
  XML := Node.XML;
  ShowMessage(XML);
end;
1 голос
/ 08 июля 2020

Вы можете использовать эту функцию для извлечения. Вы можете сделать это только для 1 узла. С помощью l oop вы можете получить значение между двумя тегами, например, wi sh.

function Parse(Text, Sol, Sag: string): String;
begin
  Delete(Text, 1, Pos(Sol, Text) + Length(Sol) - 1);
  Result := Copy(Text, 1, Pos(Sag, Text) - 1);
end;

Использование: XML:

 <test>Stackoverflow</test>

Delphi :

Parse(XML, '<test>', '</test>') //result: Stackoverflow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...