none
Anfängerfrage zu Linq to XML - Zugriff auf Elemente nicht möglich ? RRS feed

  • Frage

  • Hallo;

    mein XML File sieht auszugsweise so aus:

    <?xml version="1.0" encoding="utf-8"?>
    <Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:cl="http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
      <Description>BasisTemplate: Batchend</Description>
      <Author>Marc Rupprath</Author>
      <AutoRefresh>0</AutoRefresh>
      <DataSources>
        <DataSource Name="BatchEndData">
          <ConnectionProperties>
            <DataProvider>SQL</DataProvider>
            <ConnectString>Data Source=KILTEPT084\Vicon;Initial Catalog=BatchEndData;User Id=ViconHmiSystem;
    Password=ViconHmiSystem;</ConnectString>
          </ConnectionProperties>
          <rd:SecurityType>None</rd:SecurityType>
          <rd:DataSourceID>63b6c556-7c47-447c-8a40-4b2c3fdc2d1e</rd:DataSourceID>
        </DataSource>
      </DataSources>
      <DataSets>
        <DataSet Name="BaseProtData">
          <Query>
            <DataSourceName>BatchEndData</DataSourceName>
            <CommandText>SELECT

    .......

    Ich möchte in diesem Element:

    <ConnectString>Data Source=KILTEPT084\Vicon;Initial Catalog=BatchEndData;User Id=ViconHmiSystem;
    Password=ViconHmiSystem;</ConnectString>

    Initial Catalog=BatchEndData ändern in Initial Catalog= Andere Datenbank

    XElement DataBase = XElement.Load(@"C:\Vicon\ReportingServices\BatchEndTemplate.rdl");

    was meiner XML Datei entspricht.

    Wenn ich mir eine Liste der Elemente erzeugen lasse:  List<XElement> ElementListe = DataBase.Elements().ToList();

    Kann ich den Wert bearbeiten, aber wie übergebe ich die Listeninhalte wieder an das XML File und speichere dies ?

    Ich habe im anderen Fall versucht mit "SetelementValue" zu arbeiten, Problem:

     Ist Hier: DataBase.Element("DataSources").Element("DataSource").Element("ConnectionProperties").SetelementValue("ConnectString","Neuer String")

    der richtige zugriff, wenn "Neuer String" die Form des alten Connection String hat + meine Textersetzung der datenbank ??

    Danke euch.

    Gruß

    Marc

    Freitag, 16. August 2013 16:01

Antworten

  • Hi Marc,
    nachfolgend eine Konsolenanwendung zur Demo. Wichtig ist die Zuweisung des Namensraumes, um auch den Knoten extrahieren zu können.

    using System;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    namespace ConsoleApplication1
      {
      class Program
        {
        static void Main(string[] args)
          {
          XElement DataBase = XElement.Load(@"XMLFile1.xml");
          XNamespace ns = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition";
          XElement cs = DataBase.Descendants(ns + "ConnectString").FirstOrDefault();
          cs.Value = cs.Value.Replace("BatchEndData", "Andere Datenbank");
          using (XmlWriter wrt = new XmlTextWriter(@"c:\temp\x.xml", Encoding.Default))
            {
          DataBase.WriteTo(wrt);
            }
          Console.ReadKey();
          }
        }
      }

    --
    Peter
    Samstag, 17. August 2013 08:26

Alle Antworten

  • Hallo, bei der Verarbeitung von XML-Dokumenten muss man sehr hirarich denken. Das Dokument lädst du ersteinmal richtig. Anschließend würde ich mittels Elements oder Descendants den entsprechenden Knoten suchen.

    Von daher ist dein Code unten garnicht so Falsch. Du willst aber nur einen Bestimmten Bereich des ConnectionStrings ändern oder? Wenn du doch den kompletten Wert ersetzen willst, dann ist SetElementValue auf jeden Fall richtig.
    Wenn du doch nur einen Bereich ändern willst, dann kannst du mittels einem einfachen cast-Befehl den Wert heraus bekommen. Ein Beispiel dazu:

                XDocument d = XDocument.Parse("<test>123</test>");
                XElement e = d.Element("test");
                int w = (int)e; //w=123
    PS: Beachte bitte, das du auch den richtigen Namespace angibst. -> Peteers Antwort.

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Samstag, 17. August 2013 07:53
    Moderator
  • Hi Marc,
    nachfolgend eine Konsolenanwendung zur Demo. Wichtig ist die Zuweisung des Namensraumes, um auch den Knoten extrahieren zu können.

    using System;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    namespace ConsoleApplication1
      {
      class Program
        {
        static void Main(string[] args)
          {
          XElement DataBase = XElement.Load(@"XMLFile1.xml");
          XNamespace ns = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition";
          XElement cs = DataBase.Descendants(ns + "ConnectString").FirstOrDefault();
          cs.Value = cs.Value.Replace("BatchEndData", "Andere Datenbank");
          using (XmlWriter wrt = new XmlTextWriter(@"c:\temp\x.xml", Encoding.Default))
            {
          DataBase.WriteTo(wrt);
            }
          Console.ReadKey();
          }
        }
      }

    --
    Peter
    Samstag, 17. August 2013 08:26
  • Hallo Peter;

    Ich hatte den Namespace vergessen ;-)

    Danke nochmals.

    Gruß Marc

    Montag, 19. August 2013 07:32