Как использовать XDocument для обновления существующего файла xml, который имеет требования к пространству имен? - PullRequest
0 голосов
/ 28 марта 2020

My XML file

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns="http://a01_data_navin" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://a01_data_navin event.xsd">
  <Event>
    <eventid>1</eventid>
    <Photo>
      <filepath>files\images\memory rep02.png</filepath>
      <location>
        <lat>35.496456056584158</lat>
        <lon>-99.228515625</lon>
      </location>
      <datetimestamp>2020-03-29T00:00:00</datetimestamp>
    </Photo>
  </Event>
  <Event>
    <eventid>2</eventid>
    <Photo>
      <filepath>files\images\poop.jpeg</filepath>
      <location>
        <lat>36.137874718407268</lat>
        <lon>-89.6044921875</lon>
      </location>
      <datetimestamp>2020-03-29T00:00:00</datetimestamp>
    </Photo>
  </Event>
</Root>

Когда я использую XDocument в C#

 XDocument xml = XDocument.Load(_xmlFilePath);
            // create xml structure
            var photo_XML =  tempPhotoList.ToArray();

            xml.Element("Root")?.Add(
                new XElement("Event",
                    from photo in photo_XML
                    select new XElement("eventid", photo.EventId),
                    from photo1 in photo_XML 
                    select new XElement("Photo",
                        new XElement("filepath", photo1.FileNameForPath),
                        new XElement("location", 
                            new XElement("lat", photo1.GetLatitude()), 
                            new XElement("lon", photo1.GetLongitude())),
                            new XElement("datetimestamp", photo1.DateTimeStamp)
                    ))
            );

Когда я запускаю приведенный выше код, я не могу войти в xml файл и итерации дерева. Мне нужно добавить пространство имен, например:

XDocument xml = XDocument.Load(_xmlFilePath);
            // create xml structure
            var photo_XML =  tempPhotoList.ToArray();

            xml.Element(NameSpace+"Root")?.Add(
                new XElement("Event",
                    from photo in photo_XML
                    select new XElement("eventid", photo.EventId),
                    from photo1 in photo_XML 
                    select new XElement("Photo",
                        new XElement("filepath", photo1.FileNameForPath),
                        new XElement("location", 
                            new XElement("lat", photo1.GetLatitude()), 
                            new XElement("lon", photo1.GetLongitude())),
                            new XElement("datetimestamp", photo1.DateTimeStamp)
                    ))
            );

С добавлением Element(NameSpace+"Root"); я могу пройти через мой xml файл и добавить новое событие, но в итоге я получаю это ..

<Event xmlns="">
    <eventid>3</eventid>
    <Photo>
      <filepath>files\images\poop.jpeg</filepath>
      <location>
        <lat>17.140790393316649</lat>
        <lon>1.7578125</lon>
      </location>
      <datetimestamp>2020-03-29T00:00:00</datetimestamp>
    </Photo>
  </Event>

Мне нужна помощь, как добавить или обновить новое событие в существующем xml файл, который имеет пространство имен для работы; использовать XDocument в C#? Кажется, что использование XDocument выполняет мою задачу.

Я застрял, ребята .. пожалуйста, помогите ..

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Привет всем, так что это то, что я сделал, чтобы решить проблему в руках ..

* Я добавил пространство имен к каждому элементу XElement, а не только к root .. Извините, ладья ie из-за ранее ..: P

         XElement root = xml.Root;
         XNamespace ns = root.GetDefaultNamespace();
            root.Add(
                new XElement(ns+"Event",
                    from photo in photo_XML
                    select new XElement(ns +"eventid", photo.EventId),
                    from photo1 in photo_XML 
                    select new XElement(ns +"Photo",
                        new XElement(ns +"filepath", photo1.FileNameForPath),
                        new XElement(ns +"location", 
                            new XElement(ns +"lat", photo1.GetLatitude()), 
                            new XElement(ns +"lon", photo1.GetLongitude())),
                            new XElement(ns +"datetimestamp", photo1.DateTimeStamp)
                    ))
            );
0 голосов
/ 29 марта 2020

Попробуйте следующее:

            XDocument xml = XDocument.Load(_xmlFilePath);
            XElement root = xml.Root;
            XNamespace ns = root.GetDefaultNamespace();


            root.Add(new XElement(ns + "Event",
...