2013-05-29 16 views
7

Czy można skomentować węzeł na XDocument?Jak mogę skomentować węzeł w XML przy użyciu PowerShell?

Mam następujący tag.

<abc key="test" value="samplevalue"></abc> 

Nie muszę usuwać węzła; Chcę tylko, żeby był tam w pliku XML w formacie komentarza. Mogę użyć czegoś takiego:

$node = $xml.selectSingleNode('//abc') 
#$node.OuterXml.Insert(0,"#"); 
$node.$xml.Save("c:\test.xml") 

Ale jeśli jeden węzeł rozprzestrzenia się w dwóch liniach jak

<abc key="test" value="sampleValue"> 
</abc> 

to w jaki sposób obsłużyć ten przypadek?

+0

Każdy język ma własny sposób komentowania. W Powershell jest to '# ', w C to' // ', a [XML ma swój własny sposób] (http://www.w3schools.com/xml/xml_syntax.asp) - zobacz poniżej odpowiedź. Nie zakładaj, że wszędzie jest '//' lub '# '(w zależności od tego, do którego jesteś najbardziej przyzwyczajony). – Neolisk

Odpowiedz

4

Komentarze w języku XML są robione z <!-- i -->. Spróbuj tego:

$xml = [xml]@" 
<root> 
<abc key="test" value="samplevalue"></abc> 
<abc key="sa" value="dsad">sda 
</abc> 
</root> 
"@ 

$node = $xml.selectSingleNode('//abc') 
#OuterXML is read-only, so I took an alternative route 
$node.ParentNode.InnerXml = $node.ParentNode.InnerXml.Replace($node.OuterXml, $node.OuterXml.Insert(0, "<!--").Insert($node.OuterXml.Length+4, "-->")) 
$xml.Save("c:\test.xml") 

test.xml

<root> 
    <!--<abc key="test" value="samplevalue"></abc>--> 
    <abc key="sa" value="dsad">sda 
</abc> 
</root> 
+0

Dziękuję bardzo.Jest komentowanie węzłów.Ale jedno widzę to, że ponieważ węzeł należy do przestrzeni nazw, Node.outXml zawiera przestrzenie nazw dołączone na końcu węzła.Ale to nie jest wynik exepected.Is tam sposób, w jaki sposób mogę zapobiec wyświetlaniu przestrzeni nazw w pliku Node.OuterXml. – user1595214

+0

Próbka nie zawiera żadnych przestrzeni nazw. jeśli potrzebujesz pomocy, podaj prawidłową próbkę xml, a kod, który wypróbowałeś, nie działa. –

+0

Mój XML wygląda następująco: ' ' ' i używam tego samego kodu, który napisałeś powyżej, ale wywołanie node.Outerxml w coe również dodaje przestrzeń nazw xml. – user1595214

11

można po prostu stworzyć węzeł komentarz, i zastąpić węzły abc z tych komentarzy:

$xml = [xml]@" 
<root> 
<abc key="test" value="samplevalue"></abc> 
<abc key="sa" value="dsad">sda 
</abc> 
</root> 
"@; 

$xml.SelectNodes("//abc") | ForEach-Object { 
    $abc = $_; 
    $comment = $xml.CreateComment($abc.OuterXml); 
    $abc.ParentNode.ReplaceChild($comment, $abc); 
} 

$xml.Save(<# filename #>); 

Wyjścia:

<root><!--<abc key="test" value="samplevalue"></abc>--><!--<abc key="sa" value="dsad">sda 
</abc>--></root> 
3

Tutaj funkcja powershell Komentarz do węzła xml:

function CommentXmlNode([String] $filePath, [String] $nodeXPath) 
{ 
    [xml]$xml = Get-Content -Path "$filePath" 

    # Find the nodes that we want to comment 
    $xml.SelectNodes("$nodeXPath") | ForEach-Object { 

     $nodeToComment = $_; 
     $comment = $xml.CreateComment($nodeToComment.OuterXml); 

     # Comment the node 
     $nodeToComment.ParentNode.ReplaceChild($comment, $nodeToComment); 
    } 

    # Save the file 
    $xml.Save("$filePath"); 
} 

Oto funkcja PowerShell Odkomentuj węzła xml:

function UncommentXmlNode([String] $filePath, [String] $searchCriteria) 
{  
    [xml]$xml = Get-Content -Path "$filePath" 

    # Find all comments on the xml file 
    $xml.SelectNodes("//comment()") | ForEach-Object {  

     # We convert the comment to an xml 
     $nodeToConvert = $_; 
     $convertedNode = $nodeToConvert.InnerText | convertto-xml 
     [xml]$xmlConvertedNode = $convertedNode 

     # Find the comment that match our search criteria 
     $xmlConvertedNode.SelectNodes("/descendant::*[contains(text(), '$searchCriteria')]") | ForEach-Object { 

      $nodeToUncomment = $_; 

      $strToFind = "<!--" + $nodeToUncomment.InnerText + "-->" 

      $strReplacement = $nodeToUncomment.InnerText 

      # Replace the commented string with uncommented one 
      $con = Get-Content "$filePath" 
      $con | % { $_.Replace($strToFind, $strReplacement) } | Set-Content "$filePath" 
     } 
    } 

} 

Można ich używać tak:

CommentXmlNode "D:\temp\file.xml" "YourXPath" 

-

UncommentXmlNode "D:\temp\file.xml" "Some String in the xml node to Uncomment" 
+0

Dzięki za to .. zastanawiałem się czy znalazłem sposób na komentowanie przy zachowaniu formatowania. –

0

można użyć tego bloku cytatem jeśli chcesz zachować formatowanie i nie używać wymiany strun

budować węzeł temp zawierający skomentował wartość węzła, który nie zawiera komentarze tag, to proces wymiany.

# path to the file 
$File = "c:\pathtoyourfile\example.xml" 

# XPath to the element to un comment 
$XPath = "/Settings/SettingNode[@name='Installation']/SettingNode[@name='Features']/Setting[@name='Features' and @scope='Installation']/StringArray/String" 

# get xml file 
$xmlFile = [xml](Get-Content $File) 

# get parent and child path from XPath 
$parentXPath = $XPath.Substring(0, $XPath.LastIndexOf('/')) 
$childXPath = $XPath -replace "$parentXPath/", '' 

# get comment 
$xmlNode = $xmlFile.SelectNodes("$parentXPath/comment()") | ? { $_.InnerText -match "<$childXPath" } 

# create node containing comment content 
$tempNode = $xmlFile.CreateElement("tempNode")   
$tempNode.InnerXml = $xmlNode.Value 
$replaceNode = $tempNode.SelectSingleNode("/$childXPath") 

# process replacement 
$xmlNode.ParentNode.ReplaceChild($replaceNode, $xmlNode) 

# save change 
$xmlFile.Save($File) 
Powiązane problemy