C # чтение XML-файла, который использует префиксы имен, но не определяет пространство имен в самом документе - PullRequest
1 голос
/ 21 мая 2019

У меня есть XML-файл от клиента. Он использует префиксы имен со многими узлами. Но это не определяет никакого пространства имен в документе. Образец приведен ниже:

<?xml version="1.0"?>
<SemiconductorTestDataNotification>
  <ssdh:DocumentHeader>
    <ssdh:DocumentInformation>
      <ssdh:Creation>2019-03-16T13:49:23</ssdh:Creation>
    </ssdh:DocumentInformation>
  </ssdh:DocumentHeader>
  <LotReport>
    <BALocation>
      <dm:ProprietaryLabel>ABCDEF</dm:ProprietaryLabel>
    </BALocation>
  </LotReport>
</SemiconductorTestDataNotification>

Я использовал следующие классы XML для чтения, но не смог

System.Xml.Linq.XElement
System.Xml.XmlDocument
System.Xml.XmlReader
System.Xml.Linq.XDocument

выдает ошибку:

'ssdh' - необъявленный префикс.

Я знаю пространства имен префиксов. Это будет:

xmlns:ssdh="urn:rosettanet:specification:system:StandardDocumentHeader:xsd:schema:01.13"
xmlns:dm="urn:rosettanet:specification:domain:Manufacturing:xsd:schema:01.14" 

Добавление этих пространств имен в xml-файл самостоятельно невозможно, поскольку xml-файлов будет много, и эти файлы будут появляться ежедневно.

Возможно ли, что я создаю файл (например, xsd) и записываю в них пространства имен и читаю XML-файл, используя этот (так называемый) файл схемы в коде C #.

1 Ответ

0 голосов
/ 21 мая 2019

Вам нужно использовать не XML-метод для чтения плохого XML-файла.Попробуйте следующий код:

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

namespace ConsoleApplication3
{
    class Program1
    {
        const string BAD_FILENAME = @"c:\temp\test.xml";
        const string Fixed_FILENAME = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {

            StreamReader reader = new StreamReader(BAD_FILENAME);
            StreamWriter writer = new StreamWriter(Fixed_FILENAME);

            string line = "";
            while ((line = reader.ReadLine()) != null)
            {
                if (line == "<SemiconductorTestDataNotification>")
                {
                    line = line.Replace(">", 
                        " xmlns:ssdh=\"urn:rosettanet:specification:system:StandardDocumentHeader:xsd:schema:01.13\"" +
                        " xmlns:dm=\"urn:rosettanet:specification:domain:Manufacturing:xsd:schema:01.14\"" +
                        " >");
                }
                writer.WriteLine(line);

            }
            reader.Close();
            writer.Flush();
            writer.Close();

            XDocument doc = XDocument.Load(Fixed_FILENAME);
        }
    }

}
...