2010-03-11 189 views
2

的價值我在XML文件中下面的文字:XML更改屬性

<Config Builder="LP Wizard"> 
    <Libraries> 
     <Library Name="XCAMSource"/> 
    </Libraries> 
    <InputFormats> 
     <XCAM Format="XCAM" LibraryDirectory="C:\XCAM"/> 
    </InputFormats> 
    <OutputFormats> 
     <Pads Version="PADS 5.0" ExportAscii="false" LibraryGenerate="true" ExtendedLayers="false" AlphaLoc="PART TYPE" Format="PADS" LibraryDirectory="c:\XCAM\OUTPUT" DirectoryStructure="false" Units="Millimeters" NewCodeVersion="false" usrLayerNameElecT="1" usrLayerNameElecB="2" usrLayerNameSilk="26" usrLayerNameSilkb="29" usrLayerNameCY="20" usrLayerName3D="25" usrLayerNameAssy="27" usrLayerNameAssyb="30" usrLayerNamePmask="23" usrLayerNameSmask="21" usrLayerNameSmaskb="28" DirectImport="false"/> 
    </OutputFormats> 
</Config> 

我需要更改文本「C:\ XCAM」那LibraryDirectory=下坐。

什麼是這樣做的,我只是不希望字符串搜索LibraryDirectory= ,然後搜索第一個和最後一個「,然後更改文本相互之間的關係聰明的辦法。

回答

7
var doc = XDocument.Load("test.xml"); 
doc.Root.Element("XCAM").Attribute("LibraryDirectory").Value = "new value"; 
doc.Save("test.xml"); 

UPDATE:

doc.Root 
    .Element("InputFormats") 
    .Element("XCAM") 
    .Attribute("LibraryDirectory").Value = "new value"; 

或使用XPATH:

doc.XPathSelectElement("//InputFormats/XCAM") 
    .Attribute("LibraryDirectory").Value = "new value"; 

不要忘記添加使用System.Xml.XPathXPathSelectElement是一個擴展方法。

+0

我沒有粘貼所有的XML文件,你可以幫助我請與固定的一個請。 – 2010-03-11 12:56:02

+0

請參閱我的更新。 – 2010-03-11 13:21:44

-1

你可以將文件加載到一個XmlDocument,使用XPath選擇屬性,然後將其寫回去,這很複雜,但可能是生產代碼的「正確」解決方案。

如果您有多個文件或多個事件要替換,RegEx可能會是一個更容易的選擇 - 這可能是更快更短的代碼,但它不是描述性的。如果你正在做的是(例如)編寫非生產使用的工具(比如說,爲了在不同的機器上使用一系列的配置文件),這可能是合理的。

+3

-1:從不使用正則表達式來搜索XML或HTML。它們不是常規語言,正則表達式不能描述它們。 – 2010-03-11 13:01:43

+0

同樣在這裏。如果您想使用類似於xml的正則表達式,請使用xslt。 xslt是爲了這個。 – Falanwe 2011-01-14 17:35:46

0

你可以通過XML槽這個基本的XSL樣式表:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <!-- the identity template copies everything verbatim --> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 
    <!-- only LibraryDirectory attributes get a new value --> 
    <xsl:template match="@LibraryDirectory"> 
    <xsl:copy> 
     <xsl:value-of select="'the text here to be changed'" /> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylessheet> 

要應用樣式表XML文檔,你可以使用XslCompiledTransform class