2011-11-17 13 views
18

मैं एक एक्सएमएल फाइल में पढ़ना चाहता हूं और एक तत्व को संशोधित करना चाहता हूं और फिर उसे फ़ाइल में सहेजना चाहता हूं। प्रारूप को संरक्षित करते समय ऐसा करने का सबसे अच्छा तरीका क्या है और मिलान लाइन टर्मिनेटर (सीआरएलएफ बनाम एलएफ) भी रखें?पावरहेल एक्सएमएल और संरक्षित प्रारूप

यहाँ मैं क्या किया है, लेकिन यह है कि ऐसा नहीं करता है:

$xml = [xml]([System.IO.File]::ReadAllText($fileName)) 
$xml.PreserveWhitespace = $true 
# Change some element 
$xml.Save($fileName) 

समस्या यह है कि अतिरिक्त नई लाइन्स (उर्फ एक्सएमएल में खाली लाइनें) निकाल दिए जाते हैं और बाद मैं मिश्रित वामो और CRLF।

$f = '.\xml_test.xml' 

# Using .NET XmlDocument 
$xml = New-Object System.Xml.XmlDocument 
$xml.PreserveWhitespace = $true 

# Or using PS [xml] (older PowerShell versions may need to use psbase) 
$xml = New-Object xml 
#$xml.psbase.PreserveWhitespace = $true # Older PS versions 
$xml.PreserveWhitespace = $true 

# Load with preserve setting 
$xml.Load($f) 
$n = $xml.SelectSingleNode('//file') 
$n.InnerText = 'b' 
$xml.Save($f) 

बस सुनिश्चित करें: एक powershell नौसिखिया :)

+1

'प्रारूप को संरक्षित करने' से आपका क्या मतलब है? – manojlds

+1

शायद यह कोई फर्क नहीं पड़ता है, लेकिन आपने इसके बजाय '$ xml = [xml] (Get-content $ filename) 'की कोशिश की है? अन्यथा आपको मूल .NET XmlDocument क्लास और फ़ाइल को लोड, संपादित और सहेजने के तरीकों का उपयोग करना पड़ सकता है। – Ryan

+2

@manojids मैं presersver whitespace, newlines, टैब, आदि –

उत्तर

32

आप PowerShell [एक्सएमएल] वस्तु का उपयोग करें और $xml.PreserveWhitespace = $true निर्धारित करते हैं, या .NET XmlDocument का उपयोग कर एक ही बात कर सकते हैं की मदद के लिए

धन्यवाद XmlDocument.Load या XmlDocument.LoadXml को कॉल करने से पहले PreserveWhitespace सेट करने के लिए।

नोट: यह XML विशेषताओं के बीच सफेद स्थान को संरक्षित नहीं करता है! व्हाइट स्पेस में एक्सएमएल विशेषताओं को संरक्षित किया जाता है, लेकिन के बीच नहीं है। दस्तावेज "व्हाइट स्पेस नोड्स" (node.NodeType = System.Xml.XmlNodeType.Whitespace) को संरक्षित करने के बारे में वार्तालाप करता है और गुण नहीं देता है।

+3

देशी शक्तियों के प्रकार क्या हैं? सबकुछ .NET :) – manojlds

+1

.NET ऑब्जेक्ट्स का उपयोग करके इसे ठीक किया गया है। –

+2

@manojlds आप सही हैं, हालांकि पीएस इस मामले में कुछ .NET प्रकारों को encapsulates करता है (psbase) तो यह अभी भी .NET होने पर भी थोड़ा अलग "महसूस करता है"। :) – Ryan

1

यदि आप XmlWriter का उपयोग करके सहेजते हैं तो डिफ़ॉल्ट विकल्प दो रिक्त स्थान के साथ इंडेंट करना और सीआर/एलएफ के साथ लाइन एंडिंग को प्रतिस्थापित करना है। आप लेखक बनाने के बाद इन विकल्पों को कॉन्फ़िगर कर सकते हैं या अपनी जरूरतों के साथ कॉन्फ़िगर किए गए XmlSettings ऑब्जेक्ट के साथ लेखक बना सकते हैं।

$fileXML = New-Object System.Xml.XmlDocument 

    # Try and read the file as XML. Let the errors go if it's not. 
    [void]$fileXML.Load($file) 

    $writerXML = [System.Xml.XmlWriter]::Create($file) 
    $fileXML.Save($writerXML) 
+0

इसे वोट देना हालांकि आप अधिक जानकारी प्रदान कर सकते थे। यह विशेष रूप से उपयोगी होता है जब किसी को * सुंदर * रिक्ति के बिना xml आउटपुट की आवश्यकता होती है। – TNT

0

आप CRLF कि पाठ नोड्स के लिए वामो के बाद आप आप एक XmlWriterSettings उदाहरण का उपयोग कर सकते XmlDocument पर विधि सहेजें फोन तब्दील हो जाता है सही करने के लिए करना चाहते हैं। उसी XmlWriter का उपयोग MilesDavies192s answer के रूप में करता है लेकिन यूटीएफ -8 में एन्कोडिंग भी बदलता है और इंडेंटेशन रखता है।

$xml = [xml]([System.IO.File]::ReadAllText($fileName)) 
$xml.PreserveWhitespace = $true 

# Change some element 

#Settings object will instruct how the xml elements are written to the file 
$settings = New-Object System.Xml.XmlWriterSettings 
$settings.Indent = $true 
#NewLineChars will affect all newlines 
$settings.NewLineChars ="`r`n" 
#Set an optional encoding, UTF-8 is the most used (without BOM) 
$settings.Encoding = New-Object System.Text.UTF8Encoding($false) 

$w = [System.Xml.XmlWriter]::Create($fileName, $settings) 
try{ 
    $xml.Save($w) 
} finally{ 
    $w.Dispose() 
} 
संबंधित मुद्दे