【问题标题】:C# - Issues Selecting XML with LinqC# - 使用 Linq 选择 XML 的问题
【发布时间】:2012-04-12 16:53:35
【问题描述】:

我正在尝试提取 XML 中的事件描述,但我无法访问数据。

我正在尝试访问 eventDetailsValue 元素。

这是我的代码示例:

(版本 1)

 XElement doc = XElement.Parse(e.Result);

evtDesc = doc.Element("eventDetails").Element("eventDetails").Element("eventDetailsValue").Element("eventDetailsValue").Value;

(版本2)

XElement doc = XElement.Parse(e.Result);

var xGood = from detaildoc in doc.Descendants("eventDetails")
from d in detaildoc.Elements("eventDetail").Elements("eventDetailsValue")
select d;

我已经尝试了以下不同的元素并且它有效:

GeoLat = Convert.ToDouble(doc.Element("latitude").Value);

这是 xml 结果的示例(为简单起见,我删除了这些值):

<event>
  <longitude></longitude> 
  <latitude></latitude> 
  <category></category> 
  <dma></dma> 
  <activeAdvantage></activeAdvantage> 
  <seoUrl></seoUrl> 
  <assetID></assetID> 
  <eventID></eventID> 
  <eventDetailsPageUrl></eventDetailsPageUrl> 
- <mediaTypes>
  <mediaType></mediaType> 
  <mediaType></mediaType> 
  <mediaType></mediaType> 
  <mediaType></mediaType> 
  <mediaType></mediaType> 
  </mediaTypes>
  <eventContactEmail /> 
  <eventContactPhone /> 
  <eventName></eventName> 
  <eventDate></eventDate> 
  <eventLocation></eventLocation> 
  <eventAddress></eventAddress> 
  <eventCity></eventCity> 
  <eventState></eventState> 
  <eventZip></eventZip> 
  <eventCountry></eventCountry> 
  <usatSanctioned></usatSanctioned> 
  <regOnline></regOnline> 
  <eventCloseDate></eventCloseDate> 
  <currencyCode></currencyCode> 
  <eventTypeID></eventTypeID> 
  <eventType></eventType> 
  <hasEventResults></hasEventResults> 
  <hasMetaResults></hasMetaResults> 
  <showMap></showMap> 
  <eventContactEmail /> 
  <eventContactPhone /> 
  <displayCloseDate></displayCloseDate> 
  <excludedFromEmailing></excludedFromEmailing> 
  <regOpensMessage /> 
  <regFunnel></regFunnel> 
  <isValid></isValid> 
  <displayRegistration></displayRegistration> 
- <channels>
- <channel>
  <channelName></channelName> 
  <primaryChannel></primaryChannel> 
  </channel>
  </channels>
- <eventDetails>
- <eventDetail>
  <eventDetailsName></eventDetailsName> 
  <eventDetailsOrder></eventDetailsOrder> 
  <eventDetailsValue></eventDetailsValue> 
  </eventDetail>
- <eventDetail>
  <eventDetailsName></eventDetailsName> 
  <eventDetailsOrder></eventDetailsOrder> 
  <eventDetailsValue></eventDetailsValue> 
  </eventDetail>
  </eventDetails>
  <eventDonationLinks /> 
  <eventSanctions /> 
- <eventCategories>
- <eventCategory>
  <categoryID></categoryID> 
  <categoryGroupCount></categoryGroupCount> 
  <categoryName></categoryName> 
  <categoryType></categoryType> 
  <categoryOrder></categoryOrder> 
  <numRegistered></numRegistered> 
  <maxRegistrations></maxRegistrations> 
  <percentFull></percentFull> 
  <displayDate></displayDate> 
  <closeDate></closeDate> 
  <actualCloseDate></actualCloseDate> 
  <isExpired></isExpired> 
- <priceChanges>
- <priceChange>
  <price></price> 
  <priceUntilDate></priceUntilDate> 
  </priceChange>
  </priceChanges>
  </eventCategory>
  </eventCategories>
  <eventUrl></eventUrl> 
  <eventContactUrl></eventContactUrl> 
  <eventImageUrl></eventImageUrl> 
  </event>

任何帮助将不胜感激!

【问题讨论】:

    标签: c# xml linq windows-phone-7


    【解决方案1】:

    eventDetailsValue 位于 eventDetail 元素的数组中。所以你需要区分你想要的数组中的哪个元素。有了这个(以及这些 LinqToXml 扩展:http://searisen.com/xmllib/extensions.wiki),你可以这样写:

    XElement doc = XElement.Parse(e.Result);
    var details = doc.GetEnumerable("eventDetails/eventDetail", x => new
    {
        Name = x.Get("eventDetailsName", string.Empty),
        Order = x.Get("eventDetailsOrder", string.Empty),
        Value = x.Get("eventDetailsValue", string.Empty)
    });
    

    details 是一个 IEnumerable&lt;object&gt; 的名称、订单和您想要的值。您现在可以遍历详细信息并获取所需的值。我将 Name、Order 和 Value 都设为字符串,但通过调用 Get&lt;type&gt;("name", defaultValueByType),您可以将它们设为其他类型。

    你可以像这样遍历它们:

    foreach(var detail in details)
    {
        string value = detail.Value;
    }
    

    GetEnumerable 是以下的简写(在这种情况下):

    doc.Element("eventDetails").Elements("eventDetail").Select(x => new ...)
    

    但它会为您进行空值检查,如果您的 xml 始终生成上述 xml,那么长时间执行它不会有任何问题。 Get 返回正确的值。

    注意:因为这是一个WindowsPhone7 项目,您必须设置WindowsPhone7 的编译器标志,以便扩展编译时不会出现投诉(希望/我还没有测试过) )。

    【讨论】:

    • 我尝试了以下代码,但它不理解 doc.getenumerable XElement doc = XElement.Parse(e.Result); 的“getenumerable”部分var details = doc.GetEnumerable("eventDetails/eventDetail", x => new { Name = x.Get("eventDetailsName", string.Empty), Order = x.Get("eventDetailsOrder", string.Empty), Value = x.Get("eventDetailsValue", string.Empty) });
    • 您是否从链接下载了 XElementExtensions.cs 文件并将其添加到您的项目中?然后你需要在你的文件顶部放一个using XmlLib;
    【解决方案2】:

    试试这个查询:

    var xGood = from detaildoc in doc.Descendants("eventDetails")
    select new 
    {
    Value = detaildoc.Elements("eventDetail").Elements("eventDetailsValue").Value
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      相关资源
      最近更新 更多