2013-07-15 19 views
0

我試圖從通過文件瀏覽器提供的XML文件中讀取,但值仍爲空,即使我可以看到xml文件通過元素。無法使用XElement檢索XML元素的值

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 
    } 

更新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是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

奇怪的是,你的代碼應該產生完全相同的XName。 –

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

我已經嘗試過這樣的事情,但是當我做這個元素的時候會「不產生任何結果」,當我翻譯時 –

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

這看起來很整潔,我們不得不在下一兩週重新考慮時嘗試一下。我會隨時更新它的進展情況 –