XML добавить ссылку на корневой атрибут на другой узел? - PullRequest
0 голосов
/ 14 февраля 2019

Извиняюсь за длинный пост, код и файлы, предоставленные для устранения проблемы.

Итак, я хочу воспроизвести некоторые XML-файлы с использованием C # serializer.Эти XML-файлы должны соответствовать определенной схеме, которая не может быть скомпилирована с помощью инструмента Visual Studio XSD, поэтому я продолжаю создавать классы из необходимых XML-файлов, используя специальную вставку в Visual Studio.

Проблема IЯ добавляю соответствующие узлы с префиксом «apd:», применяемым для определения URL для каждого узла.

Пример XML-файла для демонстрации:

<?xml version="1.0" encoding="UTF-8"?>
<note xmlns="http://www.transxchange.org.uk/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:apd="http://www.govtalk.gov.uk/people/AddressAndPersonalDetails">
    <from>Jani</from>
    <heading>
        <apd:body>AddressAndPersonDetails</apd:body>
    </heading>
</note>

Visual Studio создаетследующий класс через 'paste special \ paste xml as classes':

// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.transxchange.org.uk/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.transxchange.org.uk/", IsNullable = false)]
public partial class note
{
    [XmlAttribute(Namespace = XmlSchema.InstanceNamespace)]
    public string apd = "http://www.govtalk.gov.uk/people/AddressAndPersonalDetails";

    private string fromField;

    private noteHeading headingField;

    /// <remarks/>
    public string from
    {
        get
        {
            return this.fromField;
        }
        set
        {
            this.fromField = value;
        }
    }

    /// <remarks/>
    public noteHeading heading
    {
        get
        {
            return this.headingField;
        }
        set
        {
            this.headingField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.transxchange.org.uk/")]
public partial class noteHeading
{

    private string bodyField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://www.govtalk.gov.uk/people/AddressAndPersonalDetails")]
    public string body
    {
        get
        {
            return this.bodyField;
        }
        set
        {
            this.bodyField = value;
        }
    }
}

** Примечание. Мне пришлось добавить следующее, чтобы получить атрибут xmlns: apd = "", приписанный примечанию.узел:

 [XmlAttribute(Namespace = XmlSchema.InstanceNamespace)]
 public string apd = 
 "http://www.govtalk.gov.uk/people/AddressAndPersonalDetails";

Выполнение через следующий код:

    static void Main(string[] args)
    {
        XmlSerializer Serialiser = new XmlSerializer(typeof(note));
        note readFile = new note();
        try
        {
            using (Stream reader = new FileStream(@"C:\test projects\xmlinput.xml", FileMode.Open))
            {
                readFile = (note)Serialiser.Deserialize(reader);
            }
        }
        catch (Exception ex)
        {

        }

        try
        {
            System.Xml.Serialization.XmlSerializer writer =
                new System.Xml.Serialization.XmlSerializer(typeof(note));

            var path = @"C:\test projects\output.xml";
            System.IO.FileStream file = System.IO.File.Create(path);

            writer.Serialize(file, readFile);
            file.Close();
        }
        catch (Exception ex)
        {

        }
    }

Результат в следующем файле:

<?xml version="1.0"?>
<note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:apd="http://www.govtalk.gov.uk/people/AddressAndPersonalDetails" xmlns="http://www.transxchange.org.uk/">
  <from>Jani</from>
  <heading>
    <body xmlns="http://www.govtalk.gov.uk/people/AddressAndPersonalDetails">AddressAndPersonDetails</body>
  </heading>
</note>

Я знаю, что что-то здесь упустил(тем более, что я добавляю var для добавления атрибута apd, но любые идеи, указывающие мне правильное направление, будут очень благодарны.

...