XDocumentでクエリしようとしている次のXMLがあります。
<E2ETraceEvent xmlns="http://schemas.Microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.Microsoft.com/2004/06/windows/eventlog/system">
<EventID>589828</EventID>
<Type>3</Type>
<SubType Name="Information">0</SubType>
<Level>8</Level>
<TimeCreated SystemTime="2010-06-01T09:45:15.8102117Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
<Execution ProcessName="w3wp" ProcessID="5012" ThreadID="5" />
<Channel />
<Computer>TESTSERVER3A</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.Microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Information">
<TraceIdentifier>http://msdn.Microsoft.com/en-GB/library/System.ServiceModel.Activation.WebHostCompilation.aspx</TraceIdentifier>
<Description>Webhost compilation</Description>
<AppDomain>/LM/W3SVC/257188508/Root-1-129198591101343437</AppDomain>
<Source>System.ServiceModel.Activation.ServiceParser/39498779</Source>
<ExtendedData xmlns="http://schemas.Microsoft.com/2006/08/ServiceModel/StringTraceRecord">
<VirtualPath>/Service.svc</VirtualPath>
</ExtendedData>
</TraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>
次のコードを実行すると、xEl1に対してnullが返されます手動でネームスペースを削除する場合を除く:
XDocument xDoc = XDocument.Parse(CurrentString);
XElement xEl1 = xDoc.Element("E2ETraceEvent");
XElement xEl2 = xEl1.Element("System");
XElement xEl3 = xEl2.Element("Correlation");
XAttribute xAtt1 = xEl3.Attribute("ActivityID");
String sValue = xAtt1.Value;
XDocumentでGUIDを抽出するコードをどのように記述しますか?
これを試して、私のために働く
XNamespace nsSys = "http://schemas.Microsoft.com/2004/06/windows/eventlog/system";
XElement xEl2 = xDoc.Element(nsSys + "System");
XElement xEl3 = xEl2.Element(nsSys + "Correlation");
XAttribute xAtt1 = xEl3.Attribute("ActivityID");
String sValue = xAtt1.Value;
Namespaces を使用する必要があります。
試用版の完全なソース
public static void Main()
{
XElement xDoc = XElement.Parse(
@"<E2ETraceEvent xmlns=""http://schemas.Microsoft.com/2004/06/E2ETraceEvent"">
<System xmlns=""http://schemas.Microsoft.com/2004/06/windows/eventlog/system"">
<EventID>589828</EventID>
<Type>3</Type>
<SubType Name=""Information"">0</SubType>
<Level>8</Level>
<TimeCreated SystemTime=""2010-06-01T09:45:15.8102117Z"" />
<Source Name=""System.ServiceModel"" />
<Correlation ActivityID=""{00000000-0000-0000-0000-000000000000}"" />
<Execution ProcessName=""w3wp"" ProcessID=""5012"" ThreadID=""5"" />
<Channel />
<Computer>TESTSERVER3A</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns=""http://schemas.Microsoft.com/2004/10/E2ETraceEvent/TraceRecord"" Severity=""Information"">
<TraceIdentifier>http://msdn.Microsoft.com/en-GB/library/System.ServiceModel.Activation.WebHostCompilation.aspx</TraceIdentifier>
<Description>Webhost compilation</Description>
<AppDomain>/LM/W3SVC/257188508/Root-1-129198591101343437</AppDomain>
<Source>System.ServiceModel.Activation.ServiceParser/39498779</Source>
<ExtendedData xmlns=""http://schemas.Microsoft.com/2006/08/ServiceModel/StringTraceRecord"">
<VirtualPath>/Service.svc</VirtualPath>
</ExtendedData>
</TraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>");
XNamespace nsSys = "http://schemas.Microsoft.com/2004/06/windows/eventlog/system";
XElement xEl2 = xDoc.Element(nsSys + "System");
XElement xEl3 = xEl2.Element(nsSys + "Correlation");
XAttribute xAtt1 = xEl3.Attribute("ActivityID");
String sValue = xAtt1.Value;
Console.WriteLine("sValue = {0}", sValue);
Console.ReadKey();
}
Anthonyは名前空間ビットに対処しました-XAttributeにはGUIDへの明示的な変換があるため、これは機能するはずです:
XNamespace eventNs = "http://schemas.Microsoft.com/2004/06/E2ETraceEvent";
XNamespace systemNs = "http://schemas.Microsoft.com/2004/06/windows/eventlog/system";
Guid guid = (Guid) document.Element(eventNs + "E2ETraceEvent")
.Element(systemNs + "System")
.Element(systemNs + "Correlation")
.Attribute("ActivityID");
名前空間がnot属性に継承される方法に注意してください。
ここで行ったように単一のステートメントを使用すると、生活がシンプルになる場合がありますが、does中間値が表示されないため、デバッグが難しくなります。好みに応じて変更します:)
クエリする要素の指定された「xmlns =」タグに対して、クエリでXNamespaceオブジェクトを使用します。テストしていませんが、このようなものは動作するはずです
XNamespace eventSpace = "http://schemas.Microsoft.com/2004/06/E2ETraceEvent";
XNamespace systemSpace = "http://schemas.Microsoft.com/2004/06/windows/eventlog/system";
XElement eventElement = document.Element(eventSpace + "E2ETraceEvent");
XElement systemElement = eventElement.Element(systemSpace + "System");