2013-07-15 2 views
0

Я пытаюсь прочитать из XML-файла, который предоставляется через браузер файлов, но значения также равны нулю, хотя я вижу, что xml-файл попадает в элементы.Не удается получить значения элементов XML с помощью XElement

public void UploadXml(Stream fileStream) 
    { 
    //Load xml 
     fileStream.Position = 0; 

     var xdoc = XElement.Load(fileStream); 

     IEnumerable<XElement> elements = xdoc.Elements(); 

     var codeList = new CodeList(); 

     foreach (var item in elements) 
     { 
      codeList.Name = item.Element("CODELIST_NAME").Value; 
      codeList.Description = item.Element("DESRIPTION").Value; 
      codeList.Version = item.Element("VERSION").Value; 
      codeList.EffectiveDate = DateTime.Parse(item.Element("EFFECTIVE_DATE").Value); 
      codeList.ExpirationDate = DateTime.Parse(item.Element("EXPIRATION_DATE").Value); 
     } 
     // save code list 

     // get code list ID 

     // create codes 
    } 

UPDATE XML

<?xml version="1.0" encoding="utf-8"?> 
<CONTEXT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
     xmlns="http://www.w3.org/2000/xmlns"> 
    <CONTEXT_NAME></CONTEXT_NAME> 
    <CODELIST> 
    <CODELIST_NAME></CODELIST_NAME> 
     <DESRIPTION></DESRIPTION> 
     <VERSION></VERSION> 
     <USERNAME>test user</USERNAME> 
     <OWNER_TEAM /> 
     <STEWARD_TEAM /> 
     <STATUS></STATUS> 
     <LAST_MODIFIED></LAST_MODIFIED> 
     <LAST_MODIFIED_NAME></LAST_MODIFIED_NAME> 
     <EFFECTIVE_DATE></EFFECTIVE_DATE> 
     <EXPIRATION_DATE></EXPIRATION_DATE> 
     <FILE_TIMESTAMP></FILE_TIMESTAMP> 
     <CONSTRAINED_VALUE> 
      <CODE></CODE> 
      <PARENT_ID /> 
      <NAME></NAME> 
      <DESCRIPTION></DESCRIPTION> 
     </CONSTRAINED_VALUE> 
</CODELIST> 
</CONTEXT> 

В обычном файле было бы данные в файле, очевидно, я просто должен был удалить его для образца.

стесненных теги значение будет повторяться для строк в базе данных

+1

Можете ли вы показать пример XML? – Riv

+1

Можете ли вы вставить образец XML? Также обратите внимание, что '.Elements()' получает непосредственные элементы-потомки для 1 уровня, а не все уровни ниже него. Используйте 'Descendents(). Где (x => x is XElement)', чтобы получить их по всему дереву. –

+1

Я сильно подозреваю, что это проблема с пространством имен. Также обратите внимание, что если значения даты/времени соответствуют требованиям XML, просто добавьте элемент в DateTime. –

ответ

0

Спасибо за помощь, это было полезно для меня, чтобы исправить это

Моя проблема была с тем, как Я читал эти ценности.

xdoc.Element(XName.Get("CODELIST", dns.NamespaceName)).Element(XName.Get("CODELIST_NAME", dns.NamespaceName)).Value, 

Чтение этого способа устранило это для меня.

+0

Я предпочитаю нотацию 'dns + localname', но если это сработает для вас ... –

+0

Другого пути гораздо легче читать, но по какой-то причине он не работал для меня. –

+0

Странно, ваш код должен создавать точно такие же XNames. –

1

В

IEnumerable<XElement> elements = xdoc.Elements(); 

определить родительский элемент из тех, которые вы пытаетесь разобрать. Например, если ваш XML, как:

<parent> 
    <CODELIST_NAME></CODELIST_NAME> 
    <DESRIPTION></DESRIPTION> 
    <VERSION></VERSION> 
    <EFFECTIVE_DATE></EFFECTIVE_DATE> 
    <EXPIRATION_DATE></EXPIRATION_DATE> 
</parent> 

затем записать его как

IEnumerable<XElement> elements = xdoc.Elements("parent"); 

GIANNIS

+0

Я пробовал что-то вроде этого, но когда я делаю это, элементы будут «Не давать результатов», когда я dubugging –

2

Вы должны указать (по умолчанию) пространства имен.

var xdoc = XElement.Load(fileStream); 
    var dns = xdoc.GetDefaultNamespace(); 
    .... 

, а затем ваш цикл становится (добавлено несколько исправлений области действия, а)

foreach (var item in elements) 
    { 
     var codeList = new CodeList(); 

     codeList.Name = item.Element(dns + "CODELIST_NAME").Value; 
     codeList.Description = item.Element(dns + "DESRIPTION").Value; 
     codeList.Version = item.Element(dns + "VERSION").Value; 
     codeList.EffectiveDate = DateTime.Parse(item.Element(dns + "EFFECTIVE_DATE").Value); 
     codeList.ExpirationDate = DateTime.Parse(item.Element(dns + "EXPIRATION_DATE").Value); 

     // save code list 
    } 
1

Я знаю, что вы нашли ответ, но я хотел поставить то, что я сделал, чтобы заставить его работать правильно только для удовольствия :) Вот код, который я использовал:

using System; 
using System.Xml; 
using System.Xml.Linq; 

namespace xmlTesting 
{ 
    public class codeList 
    { 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string Version { get; set; } 
    public DateTime EffectiveDate { get; set; } 
    public DateTime ExpirationDate { get; set; } 
    } 

    class program { 

    static void Main(string[] args) 
    { 
     var CL = UploadXml(XElement.Load(@"c:\debug\xmlcontent.xml")); 
     Console.WriteLine(
     string.Format("name: {0}\nDesc: {1}\nVersion: {2}\nEffectivdate: {3}\nExp: {4}" 
     , CL.Name, CL.Description, CL.Version, CL.EffectiveDate, CL.ExpirationDate) 
     ); 
     Console.ReadKey(true); 
    } 

    public static codeList UploadXml(XElement xdoc) 
    { 
     var codeList = new codeList(); 

     foreach (XElement XE in xdoc.Descendants()) 
     { 
     switch (XE.Name.LocalName) 
     { 
      case "CODELIST_NAME": 
      codeList.Name = XE.Value; 
      break; 
      case "DESCRIPTION": 
      if(codeList.Description == null) 
      codeList.Description = XE.Value; 
      break; 
      case "VERSION": 
      codeList.Version = XE.Value; 
      break; 
      case "EFFECTIVE_DATE": 
      codeList.EffectiveDate = DateTime.Parse(XE.Value); 
      break; 
      case "EXPIRATION_DATE": 
      codeList.ExpirationDate = DateTime.Parse(XE.Value); 
      break; 
     } 
     } 
     // save code list 

     // get code list ID 

     // create codes 
     return codeList; 
    } 
    } 
} 

и XML, что я использовал это было.

<?xml version="1.0" encoding="utf-8"?> 
<CONTEXT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
     xmlns="http://www.w3.org/2000/xmlns"> 
    <CONTEXT_NAME></CONTEXT_NAME> 
    <CODELIST> 
    <CODELIST_NAME>a name</CODELIST_NAME> 
     <DESCRIPTION>a desr</DESCRIPTION> 
     <VERSION>test1.1</VERSION> 
     <USERNAME>test user</USERNAME> 
     <OWNER_TEAM /> 
     <STEWARD_TEAM /> 
     <STATUS></STATUS> 
     <LAST_MODIFIED>a day</LAST_MODIFIED> 
     <LAST_MODIFIED_NAME>trae</LAST_MODIFIED_NAME> 
     <EFFECTIVE_DATE>07/05/1983</EFFECTIVE_DATE> 
     <EXPIRATION_DATE>07/05/1983</EXPIRATION_DATE> 
     <FILE_TIMESTAMP></FILE_TIMESTAMP> 
     <CONSTRAINED_VALUE> 
      <CODE></CODE> 
      <PARENT_ID /> 
      <NAME></NAME> 
      <DESCRIPTION></DESCRIPTION> 
     </CONSTRAINED_VALUE> 
</CODELIST> 
</CONTEXT> 
+1

Это выглядит довольно аккуратно, мне придется попробовать его, когда мы перегруппировываемся в течение следующей недели или двух. Я буду держать вас в курсе того, как это происходит –

Смежные вопросы