3

次の xml ファイルで、メタ タグのテキストの一部を抽出するにはどうすればよいですか? たとえば、プロパティ「role」属性を持つメタ タグからテキスト「aut」を取得したいとします。

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="en" unique-identifier="pub-  id" prefix="cc: http://creativecommons.org/ns#">
    <metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
        <dc:title id="title">Moby-Dick</dc:title>
        <meta refines="#title" property="title-type">main</meta>
        <dc:creator id="creator">Herman Melville</dc:creator>
        <meta refines="#creator" property="file-as">MELVILLE, HERMAN</meta>
        <meta refines="#creator" property="role" scheme="marc:relators">aut</meta>
        <dc:identifier id="pub-id">code.google.com.epub-samples.moby-dick-basic</dc:identifier>
        <dc:language>en-US</dc:language>
        <meta property="dcterms:modified">2012-01-18T12:47:00Z</meta>
        <dc:publisher>Harper &amp; Brothers, Publishers</dc:publisher>
        <dc:contributor id="contrib1">Dave Cramer</dc:contributor>
        <meta refines="#contrib1" property="role" scheme="marc:relators">mrk</meta>
        <dc:rights>This work is shared with the public using the Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license.</dc:rights>        
        <link rel="cc:license" href="http://creativecommons.org/licenses/by-sa/3.0/"/>
        <meta property="cc:attributionURL">http://code.google.com/p/epub-samples/</meta>
    </metadata>
</package>

selectsinglenode() メソッドをそのまま使用してみましたが、成功しませんでした:

[xml]$doc = get-content myxmlfile.xml
$node = $doc.selectsinglenode("/package/metadata/meta[@property='role']")

//and

$node = $doc.selectsinglenode("//meta[@property='role']")

// $node is null for both cases

また、Select-XML をそのまま使用してみました。

[xml]$doc = get-content myxmlfile.xml
Select-Xml -xml $doc -Xpath "/package/metadata/meta[@property='role']"

//and

Select-Xml -xml $doc -Xpath "//meta[@property='role']"
4

4 に答える 4

8

タグは、デフォルトの名前空間を定義しました。そのデフォルトの名前空間を定義するか、ワイルドカードを使用して名前空間を指定しないようにする必要があります。後者の方が簡単です:

select-xml -xml $xml -xpath "//*[@property='role']/text()" | % { $_.Node.Value }

ここにいくつかの参照があります: http://blog.stevex.net/xpath-and-xml-namespaces/ http://huddledmasses.org/xpath-and-namespaces-in-powershell/

于 2012-12-03T20:38:19.093 に答える
2

ロールノードを見つける方法は次のとおりです。

$xmlFile = [xml](Get-Content C:\temp\meta.xml)
$xmlFile.package.metadata.meta |Where-Object {$_.property -eq "role"}
$xmlFile.package.metadata.meta |Where-Object {$_.property -eq "role"} | foreach {$_.innertext}
于 2012-12-03T20:24:28.353 に答える
1

ここにいくつかの方法があります:1つです。

[xml]$foo = Get-Content PATH\TO\FILE.xml
$foo.package.metadata.meta | ?{$_.property -eq 'role'} | Select '#text'

#text
-----
aut
mrk

これにより、両方のロールノードが取得されます。autで1つだけを取得するには:

$foo.package.metadata.meta | ?{($_.property -eq 'role') -and ($_.refines -eq '#creator')} | Select '#text'
于 2012-12-03T20:23:55.867 に答える
1

これにより、各「メタ」ノードに含まれるテキストが得られます。

PS> $xml = [xml](gc .\pkg.xml)
PS> $xml.package.metadata.meta | % {write-output $_."#text"}

出力:

main
MELVILLE, HERMAN
aut
2012-01-18T12:47:00Z
mrk
http://code.google.com/p/epub-samples/
于 2012-12-03T20:32:50.473 に答える