2011-12-27 36 views
1

我有XML文件,元素/屬性名稱具有「:」字符,我如何更新其值?如何更新其名稱中包含的XML元素或屬性「:」特殊字符

<?xml version="1.0" encoding="utf-8"?> 
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.3"?> 
<my:ECR my:NoOfAutho="16" my:hideDetails="0" my:Type="ECR" my:NoOfVBUCMApprovales="10" > 
    <my:ECRNo>148</my:ECRNo> 
    <my:Stage>Approved</my:Stage> 
     <my:Details> 
     <my:ReasonForCR>Reason For CR</my:ReasonForCR> 
     <my:AreaAffected_Publications_VBUCM>false</my:AreaAffected_Publications_VBUCM> 
      <my:AreaAffected_Engineering>true</my:AreaAffected_Engineering> 
      <my:AreaAffected_Production>false</my:AreaAffected_Production> 
      <my:AreaAffected_CustomerSupport>true</my:AreaAffected_CustomerSupport> 
      <my:AreaAffected_VBUCMTest>false</my:AreaAffected_VBUCMTest> 
     </my:AreaAffectedVB_UCM> 
+4

您可能想了解[XML名稱空間](http://en.wikipedia.org/wiki/XML_namespace)。 – 2011-12-27 18:22:37

+0

請顯示您現在使用的代碼。此外,僅供參考,那些不包含「:」的名稱。它們是名稱空間前綴的名稱。 – 2011-12-27 18:24:32

+0

XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(file.xml); XmlNode node = xmlDoc.SelectSingleNode(「ECR/Type」); node.Attributes [0] .Value =「XYZ」; xmlDoc.Save(file.xml); – Waleed 2011-12-28 00:30:37

回答

1

你的XML樣本無效。前綴my未在XML中定義。

如果您的XML包含xmlns:my="schemas.microsoft.com/office/infopath/2003/myXSD/…"那麼XML至少會有一些有效的希望。

對於使用.NET代碼中的命名空間操作XML,請考慮使用Linq XDocument而不是XmlDocument。我發現Linq的XNamespaceXName類型比舊版XmlDocument對命名空間的處理非常笨重,要比XDocument類更容易使用。

更改XML的xmlns:my屬性添加到根元素:

<my:MNO xmlns:my="schemas.microsoft.com/office/infopath/2003/myXSD/…" my:NoOfAutho="16" etc... > 

在你的C#代碼,LINQ的東西添加到您的源文件的頂部一個參考:

using System.Xml.Linq; 

然後使用這樣的代碼(未檢查,可能包含語法錯別字)加載xml並訪問該元素:

XNamespace ns = "schemas.microsoft.com/office/infopath/2003/myXSD/…"; 
XName MNO_Name = ns + "MNO"; 
XDocument doc = XDocument.Load(path2); 
XElement MNO_Element = doc.Root.Descendants(MNO_Name).Single(); 

然後,您可以讀取或修改MNO元素的屬性,屬性和子級。

要讀取<MNO>100</MNO>的值,請使用MNO_Element.Value

要寫入新值到元件,分配給值屬性:MNO_Element.Value = "120";

.Single()斷言是完全有相匹配的選擇標準,類似的XmlDocument.SelectSingleNode()功能的一個節點。

從該代碼中可以看到,XML文檔中「我的」名稱空間前綴的名稱對處理XML的代碼無關緊要 - 它是「我的」前綴表示的URI的URI,它是重要的。前綴只是簡寫,所以XML編寫器無需在任何地方編寫冗長而費力的URI。

將您的XML處理代碼編寫成與XML名稱空間前綴無關是非常重要的,因爲前綴名稱可以(並且會)從一個XML文檔到下一個不同,但名稱空間URI將是相同的。

+0

我用XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(path2); XmlNode node = xmlDoc.SelectSingleNode(「ECO/ECONo」); node.Attributes [0] .Value = ECForm.No.ToString(); xmlDoc.Save(path2);但仍然給我錯誤,我應該如何寫代碼來更新例如ECONO元素? – Waleed 2011-12-28 00:27:56

+0

忘記我的文件,這裏是另一個XML文件 <?xml version =「1.0」encoding =「utf-8」?> 如何使用C#更改MNO元素和MName屬性的值? – Waleed 2011-12-28 00:57:59

+0

我用你的新元素和命名空間字符串更新了我的答案。 – dthorpe 2011-12-28 06:29:21

2

我不明白你的意思是「我怎樣才能更新其值」,但如果你知道這些都是XML namespaces它可能會有所幫助。

IE,my:ECRNo具有ECRNo一個簡單的元素名稱與my一個命名空間前綴,其映射到URN或URL - 這應該與XML內的xmlns:my=...(無論是在聲明被聲明,在父,或者在XML根元素中) - 但不會顯示在您在此處提供的XML示例中。

要使用XmlNode進行更新,您需要使用接受XmlNamespaceManager作爲第二個參數的重載SelectSingleNode方法。然後您需要名稱空間管理器上的所有.AddNamespace方法來註冊my前綴。詳情請見http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectsinglenode%28v=VS.90%29.aspx

+0

如果我想更新例如;類型屬性;我應該使用XmlNode node = xmlDoc.SelectSingleNode(「my:ECR/my:Type」); ?但它給了我錯誤「:」是特殊字符。 – Waleed 2011-12-27 23:55:46

+0

忘記我的文件,這是另一個XML文件 <?xml version =「1.0」encoding =「utf-8」?> 我怎樣才能屬性使用C#改變MNO元件和MNAME的值? – Waleed 2011-12-28 00:56:30

+0

@Waleed - 同樣的答案。我會在稍後爲您提供一個有效的代碼示例,除非其他人打我(請隨意!)。 – ziesemer 2011-12-28 01:15:36

0

冒號在xml元素/屬性中不是有效的字符。他們是名字空間。

你行

<my:ECR my:NoOfAutho="16" my:hideDetails="0" my:Type="ECR" my:NoOfVBUCMApprovales="10" > 

正確引用my命名空間了,所以你應該能夠做到這一點:

<my:ECR NoOfAutho="16" hideDetails="0" Type="ECR" NoOfVBUCMApprovales="10" > 

而且你應該罰款?如圖所示

你也必須刪除從其他地方my:在文件中特別結束標記

</ReasonForCR> 
+0

但我需要保留我的:在文件中,只需使用XmlNode node = xmlDoc.SelectSingleNode(「my:ECR/my:Type」);來更新屬性和元素值。我怎麼能做到這一點? – Waleed 2011-12-27 23:57:46

+0

忘記我的文件,這是另一個XML文件 <?xml version =「1.0」encoding =「utf-8」?> 我怎樣才能屬性使用C#改變MNO元件和MNAME的值? – Waleed 2011-12-28 00:57:53

+0

@Waleed我建議您更新您的問題(或製作一個新問題?)直接提出這個問題。 – McKay 2011-12-28 16:07:49

相關問題