0

ここに書いたxmlファイルを読みたい

<?xml version="1.0" encoding="utf-8"?>
<ReyPatch>

  <Key name="{8880-089B7A97D4B7}" new="true">
    <Value name="" type="string" patchedValue="5lpha" />
    <Value name="LayID" type="dword" patchedValue="2" />
    <Value name="Usons" type="dword" patchedValue="1" />
    <Value name="IsBaition" type="dword" patchedValue="0" />
    <Value key="key" name="Type" type="dword" patchedValue="2036" />
<Value key="KeyHars" name="Count" type="dword" patchedValue="0" />
  </Key>
<Key name="BBBE-A957C7628109}" new="true">
    <Value name="" type="string" patchedValue="4pha" />
    <Value name="LayD" type="dword" patchedValue="2" />
    <Value name="Utons" type="dword" patchedValue="1" />
    <Value name="IsBfinition" type="dword" patchedValue="0" />
    <Value key="Keys\0" name="Type" type="dword" patchedValue="2807" />
    <Value key="Keys\0" name="Text" type="string" patchedValue="2" />
    <Value key="Keys\1" name="Type" type="dword" patchedValue="2097" />
    <Value key="Keers" name="Count" type="dword" patchedValue="0" />
  </Key>
</ReyPatch>

私はこのコードを書きましたが、常に NullReferenceException があります

Uri url = new Uri("p.xml", UriKind.Relative);
            StreamResourceInfo resourceStream = Application.GetResourceStream(url);
            var doc = XDocument.Load(resourceStream.Stream);
            var newCookies = doc
            .Descendants()
            .Select(e =>
                new Key
                {
                    name = e.Element("name").ToString(),
                   IsNew =Convert.ToBoolean( e.Element("new").Value),
                    v = e.
                    Elements("Value").Select(i =>

                        new Value
                        {
                            name = i.Element("name").Value,
                            type = i.Element("type").Value,
                            patchedValue = i.Element("patchedValue").Value
                        }).ToArray()
                }).ToArray();
        }

私はすべての方法をテストしましたが、それを行う方法が見つかりません。どうすればこれを修正できますか?

4

2 に答える 2

1

namenewtypeおよびpatchedValueは属性であり、要素ではありません。Attributeの代わりに メソッドを使用する必要がありますElementNullReferenceExceptionまた、その属性が欠落しているときにa を防ぐには、 orstringを使用する代わりに属性を a にキャストする必要があります。ToStringValue

        .Select(e =>
            new Key
            {
                name = (string)e.Attribute("name"),
               IsNew =Convert.ToBoolean((string)e.Attribute("new")),
                v = e.
                Elements("Value").Select(i =>

                    new Value
                    {
                        name = (string)i.Attribute("name"),
                        type = (string)i.Attribute("type"),
                        patchedValue = (string)i.Attribute("patchedValue")
                    }).ToArray()
            }).ToArray();
于 2013-01-16T11:54:49.707 に答える
0

xml のすべての子孫を取得しているため、例外が発生しています。を使用する必要があります.Descendants("Key")。それ以外の場合、選択される最初の要素は<ReyPatch>要素であり、要素を持たず、<name>例外が発生しe.Element("name").ToString()ます。

@juharrは正しいです。属性ではなく要素を取得しようとしています。XML 要素と属性の違いを参照してください。

全体の解析は次のようになります (ノードの値を取得する代わりに、ノードのキャストを使用することを強くお勧めします):

 doc.Descendants("Key")
    .Select(key => new Key()
    {
        name = (string)key.Attribute("name"),
        IsNew = (bool)key.Attribute("new"),
        v = key.Elements()
                .Select(value => new Value()
                {
                    name = (string)value.Attribute("name"),
                    type = (string)value.Attribute("type"),
                    patchedValue = (string)value.Attribute("patchedValue")
                }).ToArray()
    }).ToArray();

また、プロパティの命名やよりわかりやすいプロパティには PascalCase を使用することをお勧めします。例えば

public class Key
{
   public string Name { get; set; }
   public bool IsNew { get; set; }
   public Value[] Values { get; set; }
}
于 2013-01-16T11:58:11.393 に答える