2016-09-05 13 views
0

すべての既存のユーザーFirefoxプロファイルに対して、powershellを使用してFirefox mimeTypes.rdfを操作しようとしています。 http://kb.mozillazine.org/MimeTypes.rdfでガイドを1として特定のノードの下に値を挿入します

<RDF:Seq RDF:about="urn:mimetypes:root"> 

私は、次のエントリに

<RDF:li RDF:resource="urn:mimetype:application/x-zip-compressed"/> 

具体的に下を追加します。私は参照XML文書からRDF:Descriptionノードを更新するためにInnerXmlを追加しましたが、RDF:Seq直接エントリは私にはわかりません。

<?xml version="1.0"?> 
<RDF:RDF xmlns:NC="http://home.netscape.com/NC-rdf#"   xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
    <RDF:Seq RDF:about="urn:schemes:root"> 
    <RDF:li RDF:resource="urn:scheme:webcal"/> 
    <RDF:li RDF:resource="urn:scheme:ircs"/> 
    <RDF:li RDF:resource="urn:scheme:mailto"/> 
    <RDF:li RDF:resource="urn:scheme:irc"/> 
    </RDF:Seq> 
    <RDF:Seq RDF:about="urn:mimetypes:root"> 
    <RDF:li RDF:resource="urn:mimetype:application/x-ica"/> 
    </RDF:Seq> 
</RDF:RDF> 

多くのアプローチが試みられてきた:

[xml]$s = (Select-Xml -Path .\seq.rdf -XPath /).node 
$xpathquery = "/RDF:RDF[@xmlns:NC=`"http://home.netscape.com/NC-rdf#`"]/RDF:Seq[@RDF:about=`"urn:mimetypes:root`"]/RDF:li" 
$nsmgr = $s.NameTable 
$nsmgr.AddNamespace('NC',"http://home.netscape.com/NC-rdf#") 
$nsmgr.AddNamespace('RDF',"http://www.w3.org/1999/02/22-rdf-syntax-ns#") 

Select-Xml -Xml $s -XPath $xpathquery -Namespace $nsmgr 

そしてAppendChild()/CreateElement()方法

$child = $s.CreateElement 
AppendChild($child) 

そしてAppendChild()さまざまな方法使用して使用:

$null = $s.RDF.seq.Where{ 
      ($_.About -match 'urn:mimetype:application') 
     }.Component.AppendChild($child) 
を参照ファイルから

またはImportNode()は:あなたが見ることができるように

foreach ($Node in $a.RDF.Seq.ChildNodes) { 
    ($xc.DocumentElement.AppendChild($s.ImportNode($a.RDF.Seq.ChildNodes, $true))) 
    #$xc.DocumentElement.Description.SetAttribute("description", "Config file for testing") 
} 

私は、XMLを操作する固体把握せずに、ここで混乱しています。問題の一部はXPathクエリです(必要な場合)。

答えて

1

私はあなたのタスクを再作成し、解決策としてこれを持ってしようとしたと思います:

[xml]$a=Get-Content "C:\temp\XML.xml" 
#clone first about node 
$b=($a.rdf.seq|where {$_.about -eq "urn:mimetypes:root"}).li.clone() 
#modify the cloned node 
$b.resource="urn:mimetype:application/x-zip-compressed" 
#add modified node to xml 
($a.rdf.seq|where {$_.about -eq "urn:mimetypes:root"}).AppendChild($b) 

#save in new file 
$a.Save("C:\temp\XML-Updated.xml") 

、結果は私が今掘りに時間を持っていますが、このことを期待していません

<?xml version="1.0"?> 
<RDF:RDF xmlns:NC="http://home.netscape.com/NC-rdf#" xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
    <RDF:Seq RDF:about="urn:schemes:root"> 
    <RDF:li RDF:resource="urn:scheme:webcal" /> 
    <RDF:li RDF:resource="urn:scheme:ircs" /> 
    <RDF:li RDF:resource="urn:scheme:mailto" /> 
    <RDF:li RDF:resource="urn:scheme:irc" /> 
    </RDF:Seq> 
    <RDF:Seq RDF:about="urn:mimetypes:root"> 
    <RDF:li RDF:resource="urn:mimetype:application/x-ica" /> 
    <RDF:li RDF:resource="urn:mimetype:application/x-zip-compressed" /> 
    </RDF:Seq> 
</RDF:RDF> 

です助けることができます

1

名前テーブルを変数に割り当てることは、魔法のように名前空間マネージャを作成することはありません。あなたは、名前空間マネージャをインスタンス化し、名前のテーブルでそれを初期化する必要があります。

[xml]$xml = Get-Content 'C:\path\to\your.xml' 
$nsm = New-Object Xml.XmlNamespaceManager($xml.NameTable) 

そうでない場合AddNamespace()呼び出しがエラーをスローします。

次に、新しい要素を作成して追加します(例:内側から:

  1. 属性を作成し、値を属性に割り当てます。
  2. ノードを作成し、ノードの属性に属性を追加します。
  3. 新しいノードを追加して追加するノードを選択して追加します。
$NC_NS = 'http://home.netscape.com/NC-rdf#' 
$RDF_NS = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' 

[xml]$xml = Get-Content 'C:\path\to\input.xml' 
$nsm = New-Object Xml.XmlNamespaceManager($xml.NameTable) 
$nsm.AddNamespace('NC', $NC_NS) 
$nsm.AddNamespace('RDF', $RDF_NS) 

$attr = $xml.CreateAttribute('RDF', 'resource', $RDF_NS) 
$attr.Value = 'urn:mimetype:application/x-zip-compressed' 

$node = $xml.CreateElement('RDF', 'li', $RDF_NS) 
$node.Attributes.Append($attr) | Out-Null 

$parent = $xml.SelectSingleNode("//RDF:Seq[@RDF:about='urn:mimetypes:root']", $nsm) 
$parent.AppendChild($node) | Out-Null 

xml.Save('C:\path\to\output.xml') 
関連する問題