답변:
xmlstarlet이 이런 종류의 것을 꽤 잘 발견했습니다.
http://xmlstar.sourceforge.net/
대부분의 배포 저장소에서도 사용 가능해야합니다. 입문 튜토리얼은 다음과 같습니다.
유망한 도구 :
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
-q -e
옵션 은 없습니다 . 예를 들어 "AndroidManifest.xml"의 "manifest"노드에서 "package"속성 값을 가져옵니다.xpath AndroidManifest.xml 'string(/manifest/@package)' 2> /dev/null
또한이 xml2
와 2xml
쌍. 일반적인 문자열 편집 도구로 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
있습니다.
2xml
부분 (필터링 된) xml2
출력 에서 XML을 쉽게 다시 만들 수 있습니다 .
cat foo.xml | xml2 | grep /bar | 2xml
— 원본과 같은 구조를 제공하지만, "bar"요소를 제외한 모든 요소가 제거되었다. 대박.
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
--xpath
은 최근에 추가 된 것으로 RHEL 6 버전에는 없습니다 xmllint
.
xmllint --xpath
는 libxml2 2.7.7 (2010 년)에 도입되었습니다.
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>
xps $doc .root.one
xps $doc 'AppendChild("three")'
and 처럼 보이면 아마도 그것을 받아 들일 것입니다 xps $doc '.three.set_InnerText("And don't you forget it!")'
.
NetBSD xmltools의 xmlsed & xmlgrep도 있습니다!
D. Bohdan은 구조화 된 텍스트 도구를위한 명령 줄 도구 목록을 유지하는 오픈 소스 GitHub 리포지토리를 유지 관리합니다. XML / HTML 도구 섹션이 있습니다.
먼저 xmlstarlet 을 사용했지만 여전히 사용하고 있습니다. 쿼리가 어려워지면 XML의 xpath2 및 xquery 기능 지원이 필요 합니다. xidel http://www.videlibri.de/xidel.html
python3 코드를 감싸는 "xp"( "xpath")와 같은 bash 함수를 정의 할 수 있습니다. 그것을 사용하려면 python3 및 python-lxml을 설치해야합니다. 혜택:
다음과 같이 사용하는 것이 쉽고 강력합니다.
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
xp ()는 다음과 같습니다 :
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"
}
jq "프로그래밍 언어"의 모든 기능을 제공하는 xq 사용을 고려하십시오. python-pip가 설치된 경우 pip install yq로 xq를 설치할 수 있습니다 . 아래 예에서는 "계정 유지"를 "계정 유지 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에는 "XQuery"라는 플러그인이 있으며 XML 문서에 대한 쿼리 기능을 제공합니다.
커맨드 라인은 아니지만 작동합니다!
grep(1)
.