[英]Need Regex pattern to extract xml request and responses from log file
我有一個包含多個xml請求和響應的日志文件。 我需要解析每個設置的請求/響應。 由於我有限的regex經驗,我一直在嘗試提出一個regex模式,以使用https://regex101.com/解析每組請求/響應,但是我沒有運氣,因此決定需要尋求幫助。
我正在使用Linux PHP 7.1。
我的xml日志文件如下所示:
***********************************************************************
API Client Address: 1.1.1.1
Begin API Request: 7/18/2019 11:45:42 AM
content-length:xxx
<?xml version="1.0"?>
<MYXML>
<header/>
<body>
<data_block>
</data_block>
</body>
</MYXML>
************************************************************************
End API Response: 7/1/2019 10:17:06 AM
Content-Length: 502
<?xml version="1.0"?>
<MYXML>
<header></header>
<body>
<data_block>
</data_block>
</body>
</MYXML>
************************************************************************
API Client Address: 1.1.1.1
Begin API Request: 7/18/2019 11:45:42 AM
content-length:xxx
<?xml version="1.0"?>
<MYXML>
<header/>
<body>
<data_block>
</data_block>
</body>
</MYXML>
************************************************************************
End API Response: 7/1/2019 10:17:06 AM
Content-Length: 502
<?xml version="1.0"?>
<MYXML>
<header></header>
<body>
<data_block>
</data_block>
</body>
</MYXML>
************************************************************************
API Client Address: 1.1.1.1
Begin API Request: 7/18/2019 11:45:42 AM
content-length:xxx
<?xml version="1.0"?>
<MYXML>
<header/>
<body>
<data_block>
</data_block>
</body>
</MYXML>
************************************************************************
End API Response: 7/1/2019 10:17:06 AM
Content-Length: 502
<?xml version="1.0"?>
<MYXML>
<header></header>
<body>
<data_block>
</data_block>
</body>
</MYXML>
`
我需要提取每組請求/響應,以便我可以分析測試響應的每組以查看是否發生錯誤。
您不需要正則表達式即可執行此操作。 您可以使用基本的字符串操作(例如strtok()( https://www.php.net/manual/zh/function.strtok.php ))將響應標記化為數組。 然后,您可以從每個響應中解析XML。
您可以使用的另一個字符串操作是:explode() https://www.php.net/manual/zh/function.explode.php
哦,我假設您不想花時間編寫XML解析器。 Google提供信息或有關在PHP中解析XML的庫。 重新發明輪子毫無意義。
從文件中,您可以使用類似以下的表達式來提取xml部分:
^<\?xml version="1.0"\?>(?:\r?\n(?!</MYXML>).*)*\r?\n</MYXML>$
從匹配項中,您可以提取那些部分並使用simplexml_load_file或將DOMDocument與DOMXPath等配合使用來獲取值。
例如:
$str = "...";
$re = '~^<\?xml version="1.0"\?>(?:\r?\n(?!</MYXML>).*)*\r?\n</MYXML>$~m';
preg_match_all($re, $str, $matches);
foreach ($matches[0] as $match) {
$dom = new DOMDocument();
$dom->loadXML($match);
$xpath = new DOMXPath($dom);
$val = $xpath->query("/MYXML/body/data_block")->item(0)->nodeValue;
echo $val . PHP_EOL;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.