2016-06-11 90 views
0

我有以下使用命名空間的XML結構:複製XML屬性使用LINQ

<office:document-content 
<office:body> 
<office:text text:use-soft-page-breaks="true"> 
    <text:p text:style-name="Standard">&lt;Text&gt;</text:p> 
</office:text> 
</office:body> 
</office:document-content> 

這來自於一個解壓的.odt作家文件的content.xml。現在我只想複製內部文本爲「<Text >」的屬性,並將副本替換爲新文本。我試過這個:

XmlFileOperations xml = new XmlFileOperations(); 
     XDocument doc = XDocument.Load(Path.Combine(ConfigManager.InputPath, "File", "content.xml")); 

     var source = doc.Descendants() 
      .Where(e => e.Value == "<Text>") 
      .FirstOrDefault(); 
     var target = new XElement(source); 
     target.Add(new XAttribute("Standard", source.Attribute(textLine))); 

     doc.Save(Path.Combine(ConfigManager.InputPath, "File", "content.xml")); 

這是行不通的。它告訴我,我在文本中有一個不能用於名稱的標誌。在這種情況下,我可以如何複製我的屬性?

謝謝!

編輯:結果應該是

<office:document-content 
<office:body> 
<office:text text:use-soft-page-breaks="true"> 
    <text:p text:style-name="Standard">&lt;Text&gt;</text:p> 
    <text:p text:style-name="Standard">some new value</text:p> 
</office:text> 
</office:body> 
</office:document-content> 

回答

1

如果我理解正確的話,你需要的<Text>值與textLine取代。

試試這個代碼

var source = doc.Descendants() 
    .Where(e => !e.HasElements && e.Value == "<Text>") 
    .FirstOrDefault(); 

var target = new XElement(source); 
target.Value = textLine; 
source.AddAfterSelf(target); 

doc.Save(...); 
+0

不但。我需要複製該屬性,以便我有兩個相同的屬性,然後替換該副本的值。 – Canox

+0

@Canox - 顯示所需結果 –

+0

好的我編輯了我的問題 – Canox

0

試試這個

using System; 
 
using System.Collections.Generic; 
 
using System.Linq; 
 
using System.Text; 
 
using System.Xml; 
 
using System.Xml.Linq; 
 

 
namespace ConsoleApplication1 
 
{ 
 
    class Program 
 
    { 
 
     const string FILENAME = @"c:\temp\test.xml"; 
 
     static void Main(string[] args) 
 
     { 
 
      
 
      XElement doc = XElement.Load(FILENAME); 
 
      XElement p = doc.Descendants().Where(x => x.Name.LocalName == "p").FirstOrDefault(); 
 
      XAttribute name = p.Attributes().Where(x => x.Name.LocalName == "style-name").FirstOrDefault(); 
 
      name.Value = "new value"; 
 
      doc.Save(FILENAME); 
 
     } 
 
    } 
 
}

+0

我想這不是我正在尋找的,因爲值被更改,但沒有創建新的屬性。我編輯了我的問題。希望現在更清楚 – Canox