2013-11-11 2 views
0

У меня есть файл XML, который я получаю от стороннего поставщика.Xml De-Serialization No Root Node

Это не структурированы обычным способом, это в принципе не имеет корня: -

<DG_X 
    attrib1="Test2" 
    attrib2="1" 
    attrib3="12345">TEST-23456</DG_X> 
<DG_Y 
    attrib1="test" 
    attrib2="Example Text" 
    attrib3="1" 
    attrib4="3" 
    attrib5= 1 
    attrib6="12412342134">Test-1234567</DG_Y> 

Я заинтересован только в первом элементе «DG_X» и мне нужно только его значение «TEST-23456».

Я новичок в Де-Serialistaion, и до сих пор мои попытки провалились: -

[Serializable] 
    [XmlRoot("DG_X")] 
    public class DM 
    { 
     [XmlText] 
     public string Value { get; set; } 

     [XmlAttribute] 
     public string attrib1 { get; set; } 

     [XmlAttribute] 
     public string attrib2 { get; set; } 

     [XmlAttribute] 
     public string attrib3 { get; set; } 

     [XmlIgnore] 
     [XmlElement("DG_Y")] 
     public string dg_key { get; set; } 

    } 

Проблема заключается в чтении второго элемента, компилятор сообщает, что есть две корневые элементы. Каков наилучший способ решить эту проблему?

+0

Перед десериализацией вам придется решить проблему «одного корня». Может быть, прочитать его в XmlReader на первом узле, а затем использовать этот читатель для десериализации? –

+0

Невозможно прочитать файл без корня? – Derek

+1

Прочтите, да. Удалить десериализацию на типизированный объект? не знаю, что я знаю, так как он ожидает «корень объекта» в xml –

ответ

1

Следующие должны работать на вашем примере

 

XmlReader xR = XmlReader.Create(@"example.xml"); 
      xR.MoveToContent(); 

      XmlSerializer xser = new XmlSerializer(typeof(DM)); 
      DM dmInstance = xser.Deserialize(xR) as DM; 
 

Мы в основном с помощью XmlReader в положение ourselfs на первом элементе и использовать это для десериализации в экземпляр объекта.

Надеется, что это помогает,

+0

Я пробовал это, и я получаю ошибки. Я буду стараться! – Derek

0

мне удалось обойти мою проблему со следующим кодом: -

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

using (var fileSteam = new StreamReader(fileStream)) 
      { 
       var settings = new XmlReaderSettings {ConformanceLevel = ConformanceLevel.Fragment}; 

       using (var reader = XmlReader.Create(fileSteam, settings)) 
       { 
        if (!reader.IsStartElement()) 
         return String.Empty; 

        var reference = reader.ReadElementContentAsString(); 
        return reference.StartsWith("DM-") ? reference : string.Format("DM-{0}", reference); 
       }