繁体   English   中英

通过linq to xml选择属性的值

[英]select value of attribute by linq to xml

在我的xml文件中,如何通过linq to xml选择ServiceAssignment元素中的属性TagId的值

注意:此xml位于字符串属性中,不在xml文件中

<AnchoredXml xmlns="urn:schema:Microsoft.Rtc.Management.ScopeFramework.2008" SchemaWriteVersion="1">
  <Key ScopeClass="Global">
    <SchemaId Namespace="urn:schema:Microsoft.Rtc.Management.Settings.ServiceAssignment.2008" ElementName="ServiceAssignments" />
    <AuthorityId Class="Host" InstanceId="00000000-0000-0000-0000-000000000000" />
  </Key>
  <Dictionary Count="1">
    <Item>
      <Key />
      <Value Signature="2ffb6b0d-0239-4016-b08b-40520d1687ff">
        <ServiceAssignments xmlns="urn:schema:Microsoft.Rtc.Management.Settings.ServiceAssignment.2008">
          <ServiceAssignment TagId="659550892">
            <Component Name="Registrar">
              <ServiceId xmlns="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008" SiteId="1" RoleName="Registrar" Instance="1" />
            </Component>
            <Component Name="PresenceFocus">
              <ServiceId xmlns="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008" SiteId="1" RoleName="UserServices" Instance="1" />
            </Component>
          </ServiceAssignment>
          <ServiceAssignment TagId="911048693">
            <Component Name="Registrar">
              <ServiceId xmlns="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008" SiteId="1" RoleName="Registrar" Instance="2" />
            </Component>
            <Component Name="PresenceFocus">
              <ServiceId xmlns="urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008" SiteId="1" RoleName="UserServices" Instance="2" />
            </Component>
          </ServiceAssignment>
        </ServiceAssignments>
      </Value>
    </Item>
  </Dictionary>
</AnchoredXml>

我尝试此代码,但给我一个空异常

var MyList = doc.Root.Elements("ServiceAssignment").Select(c=>c.Attribute(("TagId")).Value).ToList();

您在文档中有命名空间元素,因此您需要在查询中包括它们。

XNamespace itemNs = "urn:schema:Microsoft.Rtc.Management.ScopeFramework.2008";
XNamespace assignmentNs = "urn:schema:Microsoft.Rtc.Management.Settings.ServiceAssignment.2008";
var query =
    from item in doc.Descendants(itemNs + "Item")
    from assignment in item.Descendants(assignmentNs + "ServiceAssignment")
    select (long)assignment.Attribute("TagId");

您可以尝试使用此代码

var result = from item in XElement.Load("YourFile.xml").Root.Elements("ServiceAssignment")
             where item.Attribute("TagId") == value
             select item ; 

您的XML包含名称空间,因此您不能只比较全名。
如果您不关心名称空间,则可以使用XName.LocalName

var result = from element in doc.Root.Descendants()
             where element.Name.LocalName == "ServiceAssignment"
             select (int)element.Attribute("TagId");
string xmlString =
                @"<AnchoredXml xmlns='urn:schema:Microsoft.Rtc.Management.ScopeFramework.2008' SchemaWriteVersion='1'>
  <Key ScopeClass='Global'>
    <SchemaId Namespace='urn:schema:Microsoft.Rtc.Management.Settings.ServiceAssignment.2008' ElementName='ServiceAssignments' />
    <AuthorityId Class='Host' InstanceId='00000000-0000-0000-0000-000000000000' />
  </Key>
  <Dictionary Count='1'>
    <Item>
      <Key />
      <Value Signature='2ffb6b0d-0239-4016-b08b-40520d1687ff'>
        <ServiceAssignments xmlns='urn:schema:Microsoft.Rtc.Management.Settings.ServiceAssignment.2008'>
          <ServiceAssignment TagId='659550892'>
            <Component Name='Registrar'>
              <ServiceId xmlns='urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008' SiteId='1' RoleName='Registrar' Instance='1' />
            </Component>
            <Component Name='PresenceFocus'>
              <ServiceId xmlns='urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008' SiteId='1' RoleName='UserServices' Instance='1' />
            </Component>
          </ServiceAssignment>
          <ServiceAssignment TagId='911048693'>
            <Component Name='Registrar'>
              <ServiceId xmlns='urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008' SiteId='1' RoleName='Registrar' Instance='2' />
            </Component>
            <Component Name='PresenceFocus'>
              <ServiceId xmlns='urn:schema:Microsoft.Rtc.Management.Deploy.Topology.2008' SiteId='1' RoleName='UserServices' Instance='2' />
            </Component>
          </ServiceAssignment>
        </ServiceAssignments>
      </Value>
    </Item>
  </Dictionary>
</AnchoredXml>";

var doc = XDocument.Parse(xmlString);       
var TagIds = doc.Descendants()
                .Elements()
                .Where(e => 
                            e.HasAttributes && 
                            e.Name.LocalName.Equals("ServiceAssignment") && 
                            e.Attribute("TagId") != null)
                .Select(e => e.Attribute("TagId").Value);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM