태그 내의 XML 값을 쉽게 가져올 수 있도록 불완전한 XML 파일을 적절하게 태그가 지정된 XML로 형식화하는 데 문제가 있습니다.
출력 텍스트는 다음과 같습니다.
Input parameters
User : abcd
User : abc@1234
User Agent : pqr Server/12.0/1.0
file Name : tmpfile.9133
Timeout : 5
Nr thread : 1
Nr resends : 1
_____ Adresses:____
http://localhost:12345/Mrr
File tmpfile.9133 Contains 1 requests.
start thread 0
---------------- Sending --------------------
<methodCall>
<methodName>Test1</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>row1</name>
<value>
<i4>1</i4>
</value>
</member>
<member>
<name>main1</name>
<value>ADM</value>
</member>
<member>
<name>originTransactionID</name>
<value>464372231</value>
</member>
<member>
<name>min</name>
<value>99912345678</value>
</member>
<member>
<name>originTimeStamp</name>
<value>
<dateTime.iso8601>20150929T02:20:32+0300</dateTime.iso8601>
</value>
</member>
<member>
<name>main2</name>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>ID</name>
<value>
<i4>115001</i4>
</value>
</member>
<member>
<name>ValueNew</name>
<value>
<string>0</string>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</member>
<member>
<name>originHostName</name>
<value>rat</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
---------------- Recived --------------------
HTTP/1.1 200 OK
X-Powered-By: abc
Date: Mon, 28 Sep 2015 23:20:32 GMT
Server: xyz
Set-Cookie: JSESSIONID=15du5xtimqk42qoeej6o8l0u6;Path=/
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Length: 1489
Content-Type: text/xml
<?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><struct><member><name>fsdfsdfsdf</name><value><array><data><value><i4>536871492</i4></value></data></array></value></member><member><name>sdfsdfsdf</name><value><array><data><value><i4>0</i4></value></data></array></value></member><member><name>txnID</name><value><string>464372231</string></value></member><member><name>responseCode</name><value><i4>0</i4></value></member><member><name>info</name><value><array><data><value><struct><member><name>ID</name><value><i4>115001</i4></value></member><member><name>Value</name><value><string>0</string></value></member><member><name>Information</name><value><array><data><value><struct><member><name>ID</name><value><i4>11500101</i4></value></member><member><name>TSource</name><value><i4>3</i4></value></member><member><name>TValue</name><value><string>524288000</string></value></member></struct></value><value><struct><member><name>TID</name><value><i4>11500102</i4></value></member><member><name>TSource</name><value><i4>3</i4></value></member><member><name>TValue</name><value><string>519045120</string></value></member></struct></value></data></array></value></member></struct></value></data></array></value></member></struct></value></param></params></methodResponse>
----------------------------------------------
이제 두 가지 작업을 수행하고 싶습니다.
이 출력을
---------------- Recived --------------------
마커에서 끝까지 잘라서 별도의 변수에 저장합니다.그런 다음 올바른 태그와 모든 항목을 포함하는 완벽한 XML 파일이 되도록 파일을 다듬습니다. 즉,
<?xml version="1.0" encoding="UTF-8"?>
에서</methodResponse>
.
저는 솔라리스 서버에서 위의 두 가지 작업만 수행하고 싶습니다. 사용해 보았지만 xmllint --xpath
xpath가 패키지에 없는 것 같습니다. 그러니 다른 방법을 제안해주세요.
답변1
공식적인 대답은 - 당신은 모른다입니다. 손상된 XML은 설계상 치명적입니다. 모든 파서수리하다정의에 따르면 깨진 XML도 XML 파서가 아닙니다.
XML을 거부하고 "업스트림"에 해당 데이터가 손상되었음을 알려야 합니다. 왜냐하면 그렇습니다. XML을 수정하기 위해 해킹을 전달하는 것은 코드의 장기적인 안정성과 신뢰성에 매우 나쁜 소식이기 때문에 이것을 매우 강력하게 추진하십시오. 언젠가는 무작위로 깨질 수 있습니다.
즉, XML이 훼손되지 않고 텍스트 파일에 캡슐화되었을 뿐입니다. 선언과 같은 것이 빠졌지만 실제로는 공식적으로 요구되는 것은 아닙니다.
그래서 당신은 이것을 할 수 있습니다 :
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $xml;
while ( <> ) {
if ( m/-- Sending --/ .. /-- Recived --/ ) {
next if m/----/; ##skip the sending/recived lines
next if m/^\s*$/; #skip any blank lines
$xml .= $_; #add the current line to "$xml".
}
}
my $twig = XML::Twig -> new ( 'pretty_print' => 'indented_a' )
$twig -> parse ( $xml );
$twig -> set_encoding('utf-8');
$twig -> set_xml_version('1.0');
$twig -> print;
너~ 할 것이다XML::Twig
XML 라이브러리가 필요합니다. 널리 사용 가능하고 어떤 경우에는 기본적으로 설치되거나 패키지 관리자를 통해 사용할 수 있기 때문에 사용하고 있습니다 . (그렇지 않은 경우 CPAN에서 가져올 수 있어야 합니다.)
그러나 실제로는 필요하지 않습니다. print $xml
사용하려는 도구와 함께 사용할 수 있는 유효한 XML을 제공합니다.
위와 같은 소스 데이터가 주어지면 다음과 같이 표시됩니다.
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>Test1</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>row1</name>
<value>
<i4>1</i4>
</value>
</member>
<member>
<name>main1</name>
<value>ADM</value>
</member>
<member>
<name>originTransactionID</name>
<value>464372231</value>
</member>
<member>
<name>min</name>
<value>99912345678</value>
</member>
<member>
<name>originTimeStamp</name>
<value>
<dateTime.iso8601>20150929T02:20:32+0300</dateTime.iso8601>
</value>
</member>
<member>
<name>main2</name>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>ID</name>
<value>
<i4>115001</i4>
</value>
</member>
<member>
<name>ValueNew</name>
<value>
<string>0</string>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</member>
<member>
<name>originHostName</name>
<value>rat</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>