用Linq读取xml

时间:2012-07-16 18:07:44

标签: xml-parsing linq-to-xml

我无法弄清楚如何获取以下XML中的所有ItemDetail节点:

<?xml version="1.0" encoding="UTF-8"?>
<AssessmentMetadata xmlns="http://tempuri.org/AssessmentMetadata.xsd">
   <ItemDetails>
    <ItemName>I1200</ItemName>
    <ISC_Inactive_Codes>NS,NSD,NO,NOD,ND,NT,SP,SS,SSD,SO,SOD,SD,ST,XX</ISC_Inactive_Codes>
    <ISC_StateOptional_Codes>NQ,NP</ISC_StateOptional_Codes>
  </ItemDetails>
  <ItemDetails>
    <ItemName>I1300</ItemName>
    <ISC_Inactive_Codes>NS,NSD,NO,NOD,ND,NT,SP,SS,SSD,SO,SOD,SD,ST,XX</ISC_Inactive_Codes>
    <ISC_StateOptional_Codes>NQ,NP</ISC_StateOptional_Codes>
  </ItemDetails>
  <ItemDetails>
    <ItemName>I1400</ItemName>
    <ISC_Active_Codes>NC</ISC_Active_Codes>
    <ISC_Inactive_Codes>NS,NSD,NO,NOD,ND,NT,SP,SS,SSD,SO,SOD,SD,ST,XX</ISC_Inactive_Codes>
    <ISC_StateOptional_Codes>NQ,NP</ISC_StateOptional_Codes>
  </ItemDetails>
</AssessmentMetadata>

我尝试了很多东西,我认为这可能是命名空间问题,所以这是我的最后一次尝试:

var xdoc = XDocument.Load(asmtMetadata.Filepath);
var assessmentMetadata = xdoc.XPathSelectElement("/AssessmentMetadata");

1 个答案:

答案 0 :(得分:2)

您需要获取默认命名空间并在查询时使用它:

var ns = xdoc.Root.GetDefaultNamespace();
var query = xdoc.Root.Elements(ns + "ItemDetails");

您需要为任何元素添加前缀。例如,以下查询检索所有ItemName值:

var itemNames = xdoc.Root.Elements(ns + "ItemDetails")
                    .Elements(ns + "ItemName")
                    .Select(n => n.Value);