요소뿐만 아니라 xml 속성의 형식을 지정하는 방법

요소뿐만 아니라 xml 속성의 형식을 지정하는 방법

요소 속성을 쉽게 읽을 수 있도록 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로 구문 분석하므로 올바른 접근 방식이 아닙니다.

관련 정보