2016-06-11 8 views
0

ich mit Namespaces folgenden XML-Struktur habe:Kopieren eines XML-Attribut mit 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> 

Dies stammt aus dem content.xml einer entpackten ODT Schriftsteller Datei. Jetzt möchte ich nur das Attribut mit dem inneren Text "<Text>" kopieren und die Kopie durch einen neuen Text ersetzen. Ich habe es versucht:

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")); 

Dies funktioniert nicht. Es sagt mir, dass ich ein Zeichen im Text habe, das nicht auf den Namen angewendet werden kann. Wie kann ich in diesem Fall einfach mein Attribut kopieren?

Vielen Dank!

Edit: Das Ergebnis sollte sein

<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> 

Antwort

1

Wenn ich Sie richtig verstehe, Sie den Wert <Text> müssen mit textLine ersetzen.

Versuchen Sie diesen Code

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

Nicht nur. Ich muss das Attribut kopieren, damit ich zwei identische Attribute habe und dann den Wert der Kopie ersetze. – Canox

+0

@Canox - gewünschtes Ergebnis anzeigen –

+0

ok Ich habe meine Frage bearbeitet – Canox

0

Versuchen Sie, diese

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

Ich denke, das ist nicht genau das, was ich suche, weil der Wert geändert wird, aber kein neues Attribut erstellt wird. Ich habe meine Frage bearbeitet. Hoffe, jetzt ist es klarer – Canox