[xml] XML 명령 줄 처리를위한 Grep 및 Sed

쉘 스크립팅을 수행 할 때 일반적으로 데이터는 csv와 같은 단일 행 레코드 파일에 있습니다. 이와이 데이터를 처리하기 위해 정말 간단 grep하고 sed. 그러나 XML을 자주 다루어야하므로 명령 줄을 통해 해당 XML 데이터에 대한 액세스를 스크립트로 작성하는 방법을 정말로 원합니다. 가장 좋은 도구는 무엇입니까?



답변

xmlstarlet이 이런 종류의 것을 꽤 잘 발견했습니다.

http://xmlstar.sourceforge.net/

대부분의 배포 저장소에서도 사용 가능해야합니다. 입문 튜토리얼은 다음과 같습니다.

http://www.ibm.com/developerworks/library/x-starlet.html


답변

유망한 도구 :

  • nokogiri : XPath 및 CSS 선택기를 사용하여 루비로 HTML / XML DOM 파싱

  • hpricot : 더 이상 사용되지 않음

  • fxgrep : 자체 XPath와 유사한 구문을 사용하여 문서를 쿼리합니다. SML로 작성되었으므로 설치가 어려울 수 있습니다.

  • LT XML : SGML의 포함 도구에서 파생 된 XML 툴킷 sggrep, sgsort,
    xmlnorm등이있다. 자체 쿼리 구문을 사용합니다. 문서는
    매우 형식적입니다. LT XML 2는 XPath, XInclude 및 기타 W3C 표준을 지원한다고 주장합니다.

  • xmlgrep2 : XPath를 이용한 간단하고 강력한 검색. XML :: LibXML 및 libxml2를 사용하여 Perl로 작성되었습니다.

  • XQSharp : XPath의 확장 인 XQuery를 지원합니다. .NET Framework 용으로 작성되었습니다.

  • xml-coreutils : GNU coreutils와 동등한 Laird Breyer 툴킷. 이상적인 툴킷에 포함되어야 할 내용 에 대한 흥미로운 에세이 에서 논의했습니다 .

  • xmldiff : 두 개의 xml 파일을 비교하는 간단한 도구입니다.

  • xmltk : 데비안, 우분투, 페도라 또는 macports에 패키지가없는 것 같고 2007 년 이후 릴리스가 없었으며 이식 할 수없는 빌드 자동화를 사용합니다.

xml-coreutils는 가장 잘 문서화되고 가장 UNIX 지향적 인 것 같습니다.


답변

Joseph Holsten의 훌륭한 목록에 Perl 라이브러리 XML :: XPath와 함께 제공되는 xpath 명령 줄 스크립트를 추가합니다. XML 파일에서 정보를 추출하는 좋은 방법 :

 xpath -q -e '/entry[@xml:lang="fr"]' *xml


답변

또한이 xml22xml쌍. 일반적인 문자열 편집 도구로 XML을 처리 할 수 ​​있습니다.

예. q.xml :

<?xml version="1.0"?>
<foo>
    text
    more text
    <textnode>ddd</textnode><textnode a="bv">dsss</textnode>
    <![CDATA[ asfdasdsa <foo> sdfsdfdsf <bar> ]]>
</foo>

xml2 < q.xml

/foo=
/foo=   text
/foo=   more text
/foo=
/foo/textnode=ddd
/foo/textnode
/foo/textnode/@a=bv
/foo/textnode=dsss
/foo=
/foo=    asfdasdsa <foo> sdfsdfdsf <bar>
/foo=

xml2 < q.xml | grep textnode | sed 's!/foo!/bar/baz!' | 2xml

<bar><baz><textnode>ddd</textnode><textnode a="bv">dsss</textnode></baz></bar>

추신 html2/도 2html있습니다.


답변

xmllint를 사용할 수 있습니다 :

xmllint --xpath //title books.xml

대부분의 배포판과 함께 번들로 제공되며 Cygwin과 함께 번들로 제공됩니다.

$ xmllint --version
xmllint: using libxml version 20900

보다:

$ xmllint
Usage : xmllint [options] XMLfiles ...
        Parse the XML files and output the result of the parsing
        --version : display the version of the XML library used
        --debug : dump a debug tree of the in-memory document
        ...
        --schematron schema : do validation against a schematron
        --sax1: use the old SAX1 interfaces for processing
        --sax: do not build a tree but work just at the SAX level
        --oldxml10: use XML-1.0 parsing rules before the 5th edition
        --xpath expr: evaluate the XPath expression, inply --noout


답변

Windows에서 솔루션을 찾고 있다면 Powershell에는 XML을 읽고 쓰는 기능이 내장되어 있습니다.

test.xml :

<root>
  <one>I like applesauce</one>
  <two>You sure bet I do!</two>
</root>

Powershell 스크립트 :

# load XML file into local variable and cast as XML type.
$doc = [xml](Get-Content ./test.xml)

$doc.root.one                                   #echoes "I like applesauce"
$doc.root.one = "Who doesn't like applesauce?"  #replace inner text of <one> node

# create new node...
$newNode = $doc.CreateElement("three")
$newNode.set_InnerText("And don't you forget it!")

# ...and position it in the hierarchy
$doc.root.AppendChild($newNode)

# write results to disk
$doc.save("./testNew.xml")

testNew.xml :

<root>
  <one>Who likes applesauce?</one>
  <two>You sure bet I do!</two>
  <three>And don't you forget it!</three>
</root>

출처 : /server/26976/update-xml-from-the-command-line-windows


답변

NetBSD xmltools의 xmlsed & xmlgrep도 있습니다!

http://blog.huoc.org/xmltools-not-dead.html