XML 명령줄 처리를 위한 Grep and Sed equivalent
셸 스크립트를 수행할 때 일반적으로 데이터는 csv와 같은 한 줄 레코드의 파일에 저장됩니다.이 데이터를 처리하는 것은 정말 간단합니다.grep
그리고.sed
. 하지만 XML을 자주 처리해야 하므로 명령줄을 통해 해당 XML 데이터에 액세스할 수 있는 스크립트를 작성할 수 있는 방법이 필요합니다.가장 좋은 도구는 무엇입니까?
xmlstarlet이 이런 일에 꽤 능숙하다는 것을 알았습니다.
http://xmlstar.sourceforge.net/
대부분의 배포자 저장소에서도 사용할 수 있어야 합니다.소개 튜토리얼은 다음과 같습니다.
http://www.ibm.com/developerworks/library/x-starlet.html
몇 가지 유망한 도구:
nokogiri: XPath & CSS Selector를 사용하여 루비의 HTML/XML DOM 파싱
hpricot: 사용되지 않음
fxgrep: 자체 XPath와 유사한 구문을 사용하여 문서를 쿼리합니다.SML로 작성되어 있어 설치가 어려울 수 있습니다.
LT XML: SGML 도구에서 파생된 XML 툴킷:
sggrep
,sgsort
,xmlnorm
그 밖의 사람들.자체 쿼리 구문을 사용합니다.그 문서는 매우 격식을 차립니다.C. 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: debian, ubuntu, 페도라 또는 macports에 패키지가 없는 것 같고, 2007년 이후 출시되지 않았으며, 비포터블 빌드 자동화를 사용합니다.
xml-coreutils가 가장 잘 문서화되어 있고 UNIX를 지향하는 것 같습니다.
또한 있습니다.xml2
그리고.2xml
pair. 일반적인 문자열 편집 도구가 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
.
Joseph Holsten의 훌륭한 목록에 Perl 라이브러리 XML::XPath와 함께 제공되는 xpath 명령줄 스크립트를 추가합니다.XML 파일에서 정보를 추출하는 좋은 방법:
xpath -q -e '/entry[@xml:lang="fr"]' *xml
xmlint를 사용할 수 있습니다.
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>
파워셸 스크립트:
# 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>
출처 : https://serverfault.com/questions/26976/update-xml-from-the-command-line-windows
NetBSD xml 도구의 xmlsed & xmlgrep도 있습니다!
http://blog.huoc.org/xmltools-not-dead.html
정확히 무엇을 하고 싶은지에 달려있습니다.
XSLT가 가야 할 길일 수도 있지만 학습 곡선이 있습니다.xsltproc를 시도해 보고 매개변수를 제출할 수 있음을 기록합니다.
XPath 3.0/XQuery 3.0을 사용할 수 있는 명령줄도 있습니다(다른 명령줄 도구는 XPath 1.0을 사용함).
예:
http/http:
$ saxon-lint --html --xpath 'count(//a)' http://stackoverflow.com/q/91791
328
xml :
$ saxon-lint --xpath '//a[@class="x"]' file.xml
D. Bohdan은 구조화된 텍스트 도구를 위한 명령줄 도구 목록을 보관하는 오픈 소스 GitHub repo를 유지하고 있으며 XML/HTML 도구에 대한 섹션이 있습니다.
https://github.com/dbohdan/structured-text-tools#xml-html
XQuery가 좋은 솔루션일 수 있습니다.이것은 (상대적으로) 배우기 쉽고 W3C 표준입니다.
커맨드 라인 프로세서에 XQSharp을 추천합니다.
저는 xmlstarlet을 처음 사용했고 지금도 사용하고 있습니다.쿼리가 어려워지면 XML의 xpath2 및 xquery 기능 지원이 필요합니다. xidel http://www.videlibri.de/xidel.html 로 전환합니다.
그렙 등가물
일부 python3 코드를 랩하는 "xp" ("xpath")와 같이 bash 함수를 정의할 수 있습니다.사용하려면 python3와 python-lxml을 설치해야 합니다.이점:
- 예를 들어 xmlint에서 부족한 regex matching.
- 명령줄에서 (파이프에서) 필터로 사용
다음과 같이 쉽고 강력하게 사용할 수 있습니다.
xmldoc=$(cat <<EOF
<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>
EOF
)
selection='//*[namespace-uri()="http://www.sample.com/" and local-name()="job" and re:test(.,"^pro.*ing$")]/text()'
echo "$xmldoc" | xp "$selection"
# prints programming
xpx는 다음과 같습니다.
xp()
{
local selection="$1";
local xmldoc;
if ! [[ -t 0 ]]; then
read -rd '' xmldoc;
else
xmldoc="$2";
fi;
python3 <(printf '%b' "from lxml.html import tostring\nfrom lxml import etree\nfrom sys import stdin\nregexpNS = \"http://exslt.org/regular-expressions\"\ntree = etree.parse(stdin)\nfor e in tree.xpath('""$selection""', namespaces={'re':regexpNS}):\n if isinstance(e, str):\n print(e)\n else:\n print(tostring(e).decode('UTF-8'))") <<< "$xmldoc"
}
Sed equivalent
jq "프로그래밍 언어"의 모든 힘을 주는 xq를 사용하는 것을 고려해보세요.python-pip이 설치되어 있는 경우 pip install yq와 함께 xq를 설치할 수 있으며 아래 예제에서는 "Keep Accounts"를 "Keep Accounts 2"로 대체합니다.
xmldoc=$(cat <<'EOF'
<resources>
<string name="app_name">Keep Accounts</string>
<string name="login">"login"</string>
<string name="login_password">"password:"</string>
<string name="login_account_hint">input to login</string>
<string name="login_password_hint">input your password</string>
<string name="login_fail">login failed</string>
</resources>
EOF
)
echo "$xmldoc" | xq '.resources.string = ([.resources.string[]|select(."#text" == "Keep Accounts") ."#text" = "Keep Accounts 2"])' -x
JEdit에는 XML 문서에 대한 쿼리 기능을 제공하는 "XQuery"라는 플러그인이 있습니다.
명령 줄은 아니지만 작동합니다!
언급URL : https://stackoverflow.com/questions/91791/grep-and-sed-equivalent-for-xml-command-line-processing
'programing' 카테고리의 다른 글
MYSQL Left Join NULL 값을 선택하려면 어떻게 해야 합니까? (0) | 2023.09.17 |
---|---|
Pandas 데이터 프레임에 문자열이 있는지 확인합니다. (0) | 2023.09.17 |
n개 이상의 기준 중 n-1개 이상이 일치한 모든 레코드 (0) | 2023.09.17 |
데이터베이스에 없는 경우 행 삽입 (0) | 2023.09.17 |
Python에서 사전을 반복할 때 .items()를 호출해야 하는 이유는 무엇입니까? (0) | 2023.09.17 |