4

構造が部分的に不明なファイルを処理するために作成した XML リーダーからオブジェクトを返したいと考えています。

XML のサンプルを次に示します。

<xml>
  <strings>
    <Home>
      <Index>
        <PreWrapper>
          <Left>
            <Title>Blah</Title>
            <Body>Lorem ipsum dolor sit amet, consec tetuer adipiscing elit. Praesent vestibulum molestie lacus. Aenean nonummy hendrerit mauris. Phasellus porta. Fusce suscipit</Body>
            <LinkText>read more</LinkText>
            <LinkUrl>#</LinkUrl>
          </Left>
          <Center>
            <Title>Exploit your ideas</Title>
            <Body>Lorem ipsum dolor sit amet, consec tetuer adipiscing elit. Praesent vestibulum molestie lacus. Aenean nonummy hendrerit mauris. Phasellus porta. Fusce suscipit</Body>
            <LinkText>read more</LinkText>
            <LinkUrl>#</LinkUrl>
          </Center>
          <Right>
            <Title>Grow your business</Title>
            <Body>Lorem ipsum dolor sit amet, consec tetuer adipiscing elit. Praesent vestibulum molestie lacus. Aenean nonummy hendrerit mauris. Phasellus porta. Fusce suscipit</Body>
            <LinkText>read more</LinkText>
            <LinkUrl>#</LinkUrl>
          </Right>
        </PreWrapper>
      </Index>
    </Home>
  </strings>
  <config>
    <Home>
      <Index>
        <ShowPreWrapper>True</ShowPreWrapper>
      </Index>
    </Home>
  </config>
</xml>

リーダーと通話できるようにしたい

var left = reader.GetObject("xml/strings/Home/Index/PreWrapper/Left");

そして、次のような匿名オブジェクト(または動的オブジェクトですが、それらについてはあまり知りません)を返すようにします

left.Title
left.Body
left.LinkText
left.LinkUrl

また

var xml = reader.GetObjcet("xml");

すぐに飛び込むことができます

xml.strings.Home.Index....

しかし、このオブジェクトを作成する方法がわかりません。これは可能ですか?

4

5 に答える 5

7

クラスを使用してこれを概算できると思いますがExpandoObject、それを行うためのより良い方法がある可能性が非常に高いです (より緩く型付けされた言語を使用する、辞書を使用するなど)。

これを行うために .NET BCL に組み込まれているものは何もありません。

編集:最近これを見つけましたが、おそらくこの状況に当てはまります:ElasticObject

于 2012-09-02T23:14:52.377 に答える
2

C# は厳密に型指定された言語であるため、これを行うことはできません。動的 C# を使用して何らかの方法で可能かもしれませんが、私はそれについてあまり知りません。しかし、解決策として、XML を解析して辞書にすることができます。

于 2012-09-02T23:03:02.267 に答える
0

要素または属性の名前が確かにわかっている場合は、LINQ to XML でそれを行うことができます。この例では、Left要素があることがわかっています。

この LINQ ステートメントの使用

XDocument document = XDocument.Load("c:\\tmp\\test.xml");
var left = from i in document.Descendants("Left") 
           select new { Title = i.Element("Title").Value, 
                        Body = i.Element("Body").Value,
                        LinkText = i.Element("LinkText").Value, 
                        LinkUrl = i.Element("LinkUrl").Value
                      };

あなたの質問で説明されているように、これを行うことができます:

Left.Title
Left.Body
Left.LinkText
Left.LinkUrl

elementの子孫である要素の数がわからない場合は、次のLeftようにすることができます。

XDocument document = XDocument.Load("c:\\tmp\\test.xml");
var left = from i in document.Descendants("Left")
           select new { values = i.Elements().ToList() };

これにより、 というリストの列挙型が得られますvalues。リスト内の各項目にはNameandValueプロパティがあるため、それが何であるかを確認できます。

列挙型の最初の項目からすべての値を出力する例:

foreach (var s in left.First().values)
{
    Console.WriteLine(string.Format("{0} has a value of {1}", s.Name, s.Value));            
}
于 2013-04-10T20:35:36.290 に答える