요소 속성을 쉽게 읽을 수 있도록 XML 문서의 형식을 어떻게 지정합니까?
하나 또는 두 개의 요소를 반환하지만 수백 개의 특성을 갖는 XML 기반 웹 서비스가 있습니다. 개발할 때 가끔 이 서비스를 디버그해야 하지만 출력이 단지 Blob이기 때문에 어려울 수 있습니다.
생각해 보세요:
$ echo '<root><foo z="26" y="25" x="24" a="1" b="2" c="3" d="something more"/></root>' | xmllint --format -
<?xml version="1.0"?>
<root>
<foo z="26" y="25" x="24" a="1" b="2" c="3" d="something more"/>
</root>
나는 tr이 잘 작동하지만 이상적으로는 작동하지 않는다는 것을 알았습니다.
$ echo '<root><foo z="26" y="25" x="24" a="1" b="2" c="3" d="something more"/></root>' | xmllint --format - | tr ' ' \\\n
<?xml
version="1.0"?>
<root>
<foo
z="26"
y="25"
x="24"
a="1"
b="2"
c="3"
d="something
more"/>
</root>
이상적으로 출력은 xmllint와 funky hack 사이에 있을 것입니다.
<?xml version="1.0"?>
<root>
<foo
z="26"
y="25"
x="24"
a="1"
b="2"
c="3"
d="something more"/>
</root>
이렇게 하면 물건을 찾거나 정렬하는 등의 작업을 할 수 있습니다.
답변1
grep/sed를 사용하지 않는 것이 좋습니다. XML에서는 작동하지 않습니다.
perl
하지만 다행히도,XML::Twig
원하는 대로 값을 다시 형식화하고 추출할 수 있는 모든 종류의 마법 기능이 있습니다. 값을 추출하거나 사용 사례에 따라 요소를 처리 get_xpath
해야 하는 경우에 적합합니다 . twig_handlers
(또는 반복적으로 사용 children
하거나 유사하게 사용하십시오).
그러나 어쨌든 - XML 형식을 지정하십시오.
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new(
pretty_print => 'nsgmls',
);
$twig->parse (\*DATA);
$twig->print;
__DATA__
<?xml version="1.0"?>
<root>
<foo
z="26"
y="25"
x="24"
a="1"
b="2"
c="3"
d="something more"/>
</root>
인쇄물 에서는 nsgmls
다음을 제공합니다.
<?xml version="1.0"?>
<root
><foo
a="1"
b="2"
c="3"
d="something more"
x="24"
y="25"
z="26"
/></root>
indented_a
당신을 위한:
<?xml version="1.0"?>
<root>
<foo
a="1"
b="2"
c="3"
d="something more"
x="24"
y="25"
z="26"
/>
</root>
이것이 당신이 찾고 있는 것과 꽤 가까운 것 같나요?
답변2
뛰어난 BeautifulSoup Python 라이브러리를 사용할 수 있습니다. 이 코드 예제는 스크립트 입력 매개변수로 제공된 URL에서 XML 파일을 검색하고 LXML을 사용하여 구문 분석한 다음 보기 좋게 인쇄합니다.
#!/usr/bin/env python
import sys
import urllib2
import bs4
soup = bs4.BeautifulSoup(urllib2.urlopen(sys.argv[1]), ["lxml", "xml"])
print(soup.prettify())
LXML에 액세스할 수 없는 경우에는 없이 시도해 볼 수 있습니다 ["lxml", "xml"]
. 하지만 이는 데이터를 XML 대신 HTML로 구문 분석하므로 올바른 접근 방식이 아닙니다.