2

私のxmlファイルでTagIdServiceAssignment 要素の属性の値をlinq to xmlで選択する方法

注:この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>

このコードを試してみましたが、null 例外が発生しました

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

4 に答える 4

1

ドキュメント内の要素に名前空間があるため、それらをクエリに含める必要があります。

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");
于 2012-09-13T18:55:44.463 に答える
0

XMLには名前空間が含まれているため、フルネームだけを比較することはできません。
名前空間を気にしない場合は、次を使用できますXName.LocalName

var result = from element in doc.Root.Descendants()
             where element.Name.LocalName == "ServiceAssignment"
             select (int)element.Attribute("TagId");
于 2012-09-13T19:01:15.243 に答える
0
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);
于 2012-09-13T19:02:57.113 に答える
0

このコードで試すことができます

var result = from item in XElement.Load("YourFile.xml").Root.Elements("ServiceAssignment")
             where item.Attribute("TagId") == value
             select item ; 
于 2012-09-13T18:51:37.513 に答える