2012-02-10 71 views
0

如何访问XML元素nameSur,值为公司名称(这是我想要的,只是[公司名称])。我一直在收到未将对象引用设置为对象的实例。from children in lv1.Element("IndividualName").Descendants()一行。任何意见将不胜感激。使用属性CORPORATE访问命名空间内的XML

static public string GetAttributeAgencyAction2(string parFileName) 
{ 
    string retVal = string.Empty; 
    XNamespace aw = "profile.information.4.0"; 
    XDocument xmlDoc = null; 

    using (StreamReader oReader = new StreamReader(parFileName, Encoding.GetEncoding("ISO-8859-1"))) 
    { 
     xmlDoc = XDocument.Load(oReader); 
    } 

    var theme = "CORPORATE"; 

    var lv1s = from lv1 in xmlDoc.Descendants(aw + "Profile") 
       where lv1.Attribute("profileType").Value.Equals(theme) 
       //where lv1.Element("IndividualName").Value == "IndividualName" 
       from children in lv1.Element("IndividualName").Descendants() 
       select new 
       { 
        Header = lv1.Attribute("profileType").Value, 
        elemento = children.Element("IndividualName").Value, 
       }; 

    //Loop through results 
    foreach (var lv1 in lv1s) 
    { 
     Console.WriteLine(lv1.Header + " "+lv1.elemento); 
     retVal = lv1.Header; 
    } 
    return retVal; 
} 

这里是我的XML

 <Profile xmlns="profile.information.4.0" profileType="CORPORATE" gender="UNKNOWN"> 
    <creatorCode>DELPHI</creatorCode> 
    <createdDate>2012-01-24T19:35:10.000</createdDate> 
    <lastUpdaterCode>DELPHI</lastUpdaterCode> 
    <lastUpdated>2012-01-30T12:17:01.000</lastUpdated> 
    <genericName>Bonafont</genericName> 
    <IndividualName> 
     <nameSur>Company Name</nameSur> 
    </IndividualName> 
    <mfResort>5924</mfResort> 
    <mfResortProfileID>1249468</mfResortProfileID> 
    <mfContactLast>Ernert</mfContactLast> 
    <mfContactFirst>Ramillo</mfContactFirst> 
    <mfAllowMail>NO</mfAllowMail> 
    <mfAllowEMail>NO</mfAllowEMail> 
    <mfGuestPriv>NO</mfGuestPriv> 
    </Profile> 
+0

顺便说一句,这不是一个有效的命名空间。它应该是一个URI。有些工具会由于命名空间不好而拒绝该文档。 – 2012-02-10 16:53:02

回答

2

只需使用你已经定义的命名空间:

var lv1s = from lv1 in xmlDoc.Descendants(aw + "Profile") 
      where lv1.Attribute("profileType").Value.Equals(theme) 
      //where lv1.Element("IndividualName").Value == "IndividualName" 
      from child in lv1.Element(aw + "IndividualName").Descendants() 
      select new 
      { 
       Header = lv1.Attribute("profileType").Value, 
       elemento = child.Value, 
      }; 

编辑:

假设仅存在单个IndividualName元素每个Profile我会重新调整您的查询这样来检查空值:

var lv1s = from lv1 in xmlDoc.Descendants(aw + "Profile") 
      where lv1.Attribute("profileType").Value.Equals(theme) && lv1.Element(aw + "IndividualName") != null 
      select new 
      { 
       Header = lv1.Attribute("profileType").Value, 
       elemento = (string)lv1.Element(aw + "IndividualName").Element(aw+"nameSur") 
      }; 
+0

感谢您的帮助。有用! – user67144 2012-02-10 17:01:36

+0

我如何验证IndividualName和nameSur元素存在?所以我可以避免在我的代码崩溃。 – user67144 2012-02-10 17:18:07

+0

使用替代方法更新了答案 – BrokenGlass 2012-02-10 17:34:22