xml
이 태그가 여러 번 포함된 파일이 있습니다 .</w:rPr>
이것이 사용되는 방법입니다
<w:rPr>
TO REMOVE
</w:rPr>
그러나 태그 자체 간의 내용이 다른 경우가 있습니다. sed 등을 사용하여 <w:rPr>
및 사이의 모든 항목을 제거한 </w:rPr>
다음 두 태그도 제거 하는 방법이 있습니까 ?
관련 네임스페이스
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
및 파일 자체(형식이 지정된 유효한 XML)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:lvl w:ilvl="0">
<w:rPr>
TO REMOVE
</w:rPr>
<w:rPx>
<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
</w:rPx>
</w:lvl>
</root>
답변1
긴 이야기 짧게
제발, 절대 사용하지 마세요sed이번 임무를 위해!
또는 를 sed
사용할 때마다 새끼 고양이를 죽입니다.html
xml
이건 과제야xmlstarlet
(적절한 XML 파서)와 그의 친구들길, 이와 같이:
xmlstarlet ed \
-L \
-N w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" \
-d '//w:rPr' file.xml
몇 가지 설명:
-L
파일 편집비행 중좋다sed -i
-N
설정XML 네임스페이스, 필요하다면-d
xpath
표현식과 일치하는 노드 삭제
확인하다xmlstarlet edit --help
사용basex
순수 XQuery 솔루션:
$ cat XQuery
declare namespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
copy $input := doc("/dev/stdin")
modify delete node $input//w:rPr
return $input
$ basex XQuery < file.xml
사용 XQuery
및 xidel
:
그리고제한된 XQuery 기능.
xidel --xml --xquery '
declare namespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
x:replace-nodes(//w:rPr, ())
' file.xml
이론:
컴파일 이론에 따르면 XML/HTML은 다음을 기반으로 하는 정규식을 사용하여 구문 분석할 수 없습니다.유한 상태 머신. XML/HTML의 계층적 구조로 인해 다음을 사용해야 합니다.푸시다운 오토마톤조작하고왼손잡이 수용체도구와 유사한 구문 사용아크릴.
realLife©®™ 일상 도구껍데기:
다음 중 하나를 사용할 수 있습니다.
- xmllint
libxml2
xpath1은 일반적으로 기본적으로 설치됩니다. - xmlstarlet편집, 선택, 변환 가능...기본적으로 설치되지 않음, XPath1
- 길Perl 모듈 XML::XPath, XPath1을 통해 설치됨
- 베이직X
basex
패키지 , 전체 XQuery 3.1 은 기본적으로 설치되지 않습니다. - 히델XPath3, 일부 XQuery 3(업데이트 없음)
- 색슨 린트내 프로젝트, @Michael Kay의 Saxon-HE Java 라이브러리 XPath3에 대한 래퍼
아니면 고급 언어와 적절한 라이브러리를 사용할 수도 있습니다.
파이썬~의lxml
( from lxml import etree
)
진주~의XML::LibXML
,XML::XPath
,XML::Twig::XPath
,HTML::TreeBuilder::XPath
PHP DOMXpath
,이 예를 확인하세요
확인하다:HTML 태그와 함께 정규식 사용