3

始める前に、これは私の最初の投稿です。何か間違ったことや行っていないことがあれば教えてください。投稿を編集します。

次のようにフォーマットされたドキュメントがあります。

<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
    <EventData>
        <Data Name='SubjectUserSid'>S-1-0-0</Data>
        <Data Name='SubjectUserName'>MACHINE$</Data>
        <Data Name='SubjectDomainName'>DOMAIN</Data>
        <Data Name='SubjectLogonId'>0x0</Data>
        <Data Name='TargetUserSid'>S-1-0-0</Data>
        <Data Name='TargetUserName'>username</Data>
        <Data Name='TargetDomainName'>TDname</Data>
        <Data Name='Status'>0x0</Data>
        <Data Name='FailureReason'>%%2313</Data>
        <Data Name='SubStatus'>0x0</Data>
        <Data Name='LogonType'>10</Data>
    </EventData>
</Event>

XML から値 (属性値と対応する要素値の両方) を抽出できるものを考え出すのに少し問題があります。属性ごとにステートメントが必要ですか、それともリストを返して値をループするだけですか?

編集:値を抽出して、データベースに送信できるようにする必要があります。これにはLINQを使用してみたいと思いますが、Xpathでもうまくいくかもしれません

EDIT2:3つの良い答えをありがとう、私は必要条件を持っていません。回答に賛成票を投じる評判はまだありません。テストする前に開発マシンにアクセスする必要がありますが、これは本当に私が探しているものに見えます:)

4

3 に答える 3

2

私が理解している限り、xml を解析するには、例としてプロパティと値にアクセスする必要があります。

属性ごとにステートメントが必要ですか、それともリストを返して値をループするだけですか?

いいえ、あなたはしません。次のコードを例として使用して、xml を解析します。

//str contains your xml
XDocument xml = XDocument.Parse(str);
XNamespace ns = "http://schemas.microsoft.com/win/2004/08/events/event";

foreach (var node in xml.Descendants(ns + "Data"))
{
    Console.WriteLine ("Name: " + (string)node.Attribute("Name") + "; "+
                       "Value: " + node.Value);
}

印刷されます:

Name: SubjectUserSid; Value: S-1-0-0
Name: SubjectUserName; Value: MACHINE$
Name: SubjectDomainName; Value: DOMAIN
Name: SubjectLogonId; Value: 0x0
Name: TargetUserSid; Value: S-1-0-0
Name: TargetUserName; Value: username
Name: TargetDomainName; Value: TDname
Name: Status; Value: 0x0
Name: FailureReason; Value: %%2313
Name: SubStatus; Value: 0x0
Name: LogonType; Value: 10
于 2013-04-08T12:18:52.577 に答える
1

各要素の属性を取得するには:

var attributes = from n in xml.Descendants("Data")
                        select n.Attributes("Name").Select(s => s.Value);

各要素のデータを取得するには:

var data = from n in xml.Descendants("EventData")
                        select n.Elements("Data").Select(s => s.Value);

または、1 つのクエリで: -

var nodes = from n in xml.Descendants("EventData").Elements("Data")
                        select new
                        {
                            Data = n.Value,
                            Attribute = n.Attribute("Name").Value
                        };
于 2013-04-08T12:31:01.357 に答える
1
XNamespace ns = "http://schemas.microsoft.com/win/2004/08/events/event";
var document = XDocument.Parse(
    "<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>" +
    "<EventData>" +
    "    <Data Name='SubjectUserSid'>S-1-0-0</Data>" +
    "    <Data Name='SubjectUserName'>MACHINE$</Data>" +
    "    <Data Name='SubjectDomainName'>DOMAIN</Data>" +
    "    <Data Name='SubjectLogonId'>0x0</Data>" +
    "    <Data Name='TargetUserSid'>S-1-0-0</Data>" +
    "    <Data Name='TargetUserName'>username</Data>" +
    "    <Data Name='TargetDomainName'>TDname</Data>" +
    "    <Data Name='Status'>0x0</Data>" +
    "    <Data Name='FailureReason'>%%2313</Data>" +
    "    <Data Name='SubStatus'>0x0</Data>" +
    "    <Data Name='LogonType'>10</Data>" +
    "</EventData>" +
    "</Event>");

var q = from element in document.Root.Element(ns + "EventData").Elements(ns + "Data")
        select new
        {
            Name = element.Attribute("Name").Value,
            Value = element.Value
        };
于 2013-04-08T12:18:43.060 に答える