使用LINQ to XML的父引用访问子节点值

时间:2011-05-19 11:04:08

标签: c# .net xml linq linq-to-xml

我无法访问子节点值。下面是XML结构和创建新联系人的代码。

<Order xmlns="http://example.com">
    <MiscContact>
        <MiscContact>
            <ContactType>MailingContact</ContactType>
            <Contact>
                <Name>
                    <First>JIM</First>                      
                    <Last>RON</Last>
                    <FullName>RON JIM</FullName>
                </Name>
                <IsValid>false</IsValid>
              </Contact>
        </MiscContact>
    </MiscContact> 
    <ExportForm>
        <Contact>
            <Name>
                <First>JIM</First>                      
                <Last>RON</Last>
                <FullName>RON JIM</FullName>                   
            </Name>                
        <IsValid>false</IsValid>
        </Contact>
    </ExportForm>
</Order>

仅为<MiscContact>创建新联系人的代码:

XNamespace Namespace = "http://online.us.com";
var MiscContact = from mc in xmlDoc.Descendants(Namespace + "Contact") 
                  where mc.Parent.Name.Equals("MiscContact")
                  select new Contact
                  { Name = ob.Element(Namespace + "Name").Value }

我遇到的问题是,即使我有where子句只选择其父级为MiscContact的联系人,但<MiscContact><ExportForm>的联系人部分都已加载。

知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:1)

您的代码似乎与where子句一起正常工作,并从Name中提取MiscContact -> Contact -> Name元素。我认为你的问题是你最后使用的是.Value,它将所有这些值连接在一起:

<Name>
  <First>JIM</First>                      
  <Last>RON</Last>
  <FullName>RON JIM</FullName>
</Name>

结果是“JIMRONRON JIM”。如果您需要"FullName",那么您应该使用:

mc.Element(Namespace + "Name")
  .Element(Namespace + "FullName").Value

根据需要将"FullName"替换为"First""Last"