XML 파일에서 단일 속성을 어떻게 추출합니까?

XML 파일에서 단일 속성을 어떻게 추출합니까?

저는 정규 표현식, sed 등에 대해 잘 알지 못하고 지금 당장 알아내기에는 약간 게으릅니다. 따라서 이 줄을 어떻게 추출합니까?

<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

XML 구조가 더 필요한지 알려주십시오.

답변1

입력 데이터(XML 파일)는 구조화되어 있으므로 일반 텍스트로 처리하고 정규식을 사용하는 것보다 구조화된 데이터에 대한 쿼리를 사용하는 것이 더 좋습니다.

xmllint --xpathxml 입력에서 XPath 표현식을 평가하는 데 사용할 수 있습니다 .

$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am

- 해당 파일의 다양한 네임스페이스를 처리해야 하기 때문에 약간 복잡하지만 그럼에도 불구하고 작동합니다.

XPath에 대한 자세한 내용은 사양을 참조하세요.http://www.w3.org/TR/xpath/

답변2

정규식이나 sed를 사용하지 않습니다. XML 파서와 XML 쿼리 언어(XPath 또는 XQuery)를 사용합니다. 유감스럽게도 세부 사항은 상황에 따라 다릅니다. 예를 들어 "yweather"는 네임스페이스의 짧은 이름(접두사)이고 이것이 어떤 네임스페이스를 나타내는지 알아야 합니다.

답변3

Michael Kay가 말했듯이 정답은 XML 전용 도구를 사용하는 것입니다.

빠르고 더러운 솔루션을 위해 sed 접근 방식이 있습니다. 이 파일부터 시작해 보겠습니다.

$ cat file
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

일몰 시간을 추출하려면:

$ sed -rn 's/.*sunset="([^"]*)".*/\1/p' file
7:06 pm

정규식을 이해하기 위해 정규식을 세 부분으로 나누어 보겠습니다.

  1. .*라인의 처음부터 두 번째 부분까지 일치합니다.

  2. 이 부분인 은 sunset="([^"]*)"문자와 일치하며 sunset="그 뒤에는 를 제외한 모든 문자가 오고 "그 뒤에는 닫는 가 옵니다 ". 표현은 [^"]해당 문자를 제외한 모든 문자를 의미하며 "해당 [^"]*문자의 개수를 의미합니다. parens는 나중에 참조할 sed의 그룹 1에 (...)내부 문자를 캡처합니다 ."..."\1

  3. .* 일몰 표현식 뒤의 모든 문자와 일치합니다.

답변4

나는 같은 대답을 할 것이다제레미 커하지만 예를 들어 보겠습니다 xml.

루트 폴더에 호출된 xml 파일이 있고 config.xml태그의 속성이나 속성을 읽으려고 합니다 widget.

config.xml:

<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="16" id="co.app.world" ios-CFBundleVersion="0.1.3" version="3.0.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>AppName</name>
    <description>Description.</description>
    <author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
</widget>

속성 값을 얻으려면 android-versionCode터미널에 다음을 입력합니다.

xmllint --xpath "string(//*[local-name()='widget']/@android-versionCode)" config.xml

산출:

16

/*[local-name()='widget']설명: 태그를 매핑 widget한 다음 @android-versionCode이 속성을 읽는 데 사용합니다 .

관련 정보