C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C# xmlを読み込みプロパティを作りたい

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■83101 / inTopicNo.1)  C# xmlを読み込みプロパティを作りたい
  
□投稿者/ むこ (1回)-(2017/03/06(Mon) 20:06:50)

分類:[C#] 


C# Windows Formsで開発している者です。

下記のようなxmlファイルを読み込み、2つのプロパティを作りたいと思っています。

@【record Name】を格納するプロパティ
A【nameとnumber】を格納するプロパティ
結果としては、@にAの値があるプロパティが複数件できると思いますが、どのようにすれば設定できるでしょうか?

<?xml version="1.0" encoding="shift_jis"?>
<Node Name = "A">
<record Name = "Aさん">
<name>佐藤</name>  
<number>1</number>
</record Name>
<record Name = "Bさん"> 
<name>鈴木</name>
<number>2</number>
</record Name>
:
:
:
</Node Name>
引用返信 編集キー/
■83105 / inTopicNo.2)  Re[1]: C# xmlを読み込みプロパティを作りたい
□投稿者/ 魔界の仮面弁士 (1162回)-(2017/03/06(Mon) 22:10:23)
No83101 (むこ さん) に返信
> </record Name>

閉じタグに空白が含まれているので、これは XML とは呼べません。

整形式の XML 文書になるよう、データを見直すか、もしくは
その「XML モドキ」を自力で読み取るかの二択ですね。


> 2つのプロパティを作りたいと思っています。
「プロパティを作る」という要件が、どのような結果を想定しているのか
わからなかったのですが、LINQ to XML が使えないでしょうか。

using System;
using System.Linq;
using System.Xml.Linq;


string srcXml =
@"<?xml version='1.0' encoding='shift_jis'?>
<Node Name='A'>
  <record Name='Aさん'>
    <name>佐藤</name>
    <number>1</number>
  </record>
  <record Name='Bさん'>
    <name>鈴木</name>
    <number>2</number>
  </record>
  <record Name='Zさん'>
    <name>山田</name>
    <number>26</number>
  </record>
</Node>";

// var root = XDocument.Load("C:\folder\file.xml");
var root = XDocument.Parse(srcXml).Root;

// name/number プロパティを持つオブジェクトの
// 連想配列「q」を作成する
var q = root.Elements("record").Select(r => new
{
    Name = r.Attribute("Name").Value,
    name = r.Element("name").Value,
    number = int.Parse(r.Element("number").Value),
}).ToDictionary(o => o.Name, o => new { o.name, o.number });


// 「q」の内容を読み取る
Console.WriteLine("record の数 => {0}" , q.Count);
Console.WriteLine("record.Name を列挙:");
foreach (var key in q.Keys)
{
    Console.Write("  '{0}'", key);
}
Console.WriteLine();

string name = "Bさん";
Console.WriteLine("Name 属性値が'{0}'なrecordの内容", name);
if (q.ContainsKey(name))
{
    var record = q[name];
    Console.WriteLine("{0}: name={1}, number={2}", name, record.name, record.number);
}
else
{
    Console.WriteLine("'{0}'というNameを持つ record はありません。", name);
}

引用返信 編集キー/
■83114 / inTopicNo.3)  Re[2]: C# xmlを読み込みプロパティを作りたい
□投稿者/ むこ (2回)-(2017/03/07(Tue) 08:43:59)
No83105 (魔界の仮面弁士 さん) に返信
> ■No83101 (むこ さん) に返信
>></record Name>
>
> 閉じタグに空白が含まれているので、これは XML とは呼べません。

すみません</record>の間違いですね。
引用返信 編集キー/
■83121 / inTopicNo.4)  Re[3]: C# xmlを読み込みプロパティを作りたい
□投稿者/ 魔界の仮面弁士 (1167回)-(2017/03/07(Tue) 09:52:00)
No83105 (魔界の仮面弁士) への訂正
> // var root = XDocument.Load("C:\folder\file.xml");
> var root = XDocument.Parse(srcXml).Root;

コメントになっている方の行は
 // var root = XDocument.Load(@"C:\folder\file.xml").Root;
に直しておいてください。ファイルパスの \ の処理と Root プロパティの指定を忘れていました。


No83114 (むこ さん) に返信
>>> </record Name>
>>閉じタグに空白が含まれているので、これは XML とは呼べません。
> すみません</record>の間違いですね。

やっぱりそうですよね。

ところで、先の回答でやりたいことは実現できそうですか?
引用返信 編集キー/
■83154 / inTopicNo.5)  Re[4]: C# xmlを読み込みプロパティを作りたい
□投稿者/ むこ (3回)-(2017/03/08(Wed) 19:00:46)
No83114 (むこ さん) に返信

> ところで、先の回答でやりたいことは実現できそうですか?

色々自分で検証していたら遅くなってしまいました。
無事に解決です!
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ