1

XML ファイルを読み取って、データ モデルのエンティティに書き込もうとしています。Xml は次のようになります。

...
<item>
   <guid>123456-7890</guid>
   <enclosure type="image/jpeg" url="http://example.com"/>
</item>

エンクロージャノード全体が存在しない場合があるため、クエリで let を使用していますが、壊れています:

var items = from xmlitems in xElem2.Descendants("item")
            let node_enclosure = xmlitems.Element("enclosure")
            select new
            {
                 strImageUrl = node_enclosure == null ? "none" : node_enclosure.Attribute("url").Value,
                 strguid = xmlitems.Element("guid").Value,
            };

更新:次に、xml から値を Datacontext に保存しようとしています。

using (var datacontext = new db_RBEntities1())
{
     foreach (var item in items)
     {
         try
         {                 
              xmltable = new RSSTable();
              xmltable.guid = item.guid;
              xmltable.imageurl= item.strImageUrl;            
              datacontext.RSSTable.AddObject(xmltable);
         }
         catch (EntitySqlException ex)
         {
         }
     }
     datacontext.SaveChanges();
}

クエリの何が問題なのか教えていただけますか? アドバイスありがとうございます!

よろしく

4

2 に答える 2

3

コードでどのような問題が発生しているのかわかりませんが、少し見栄えが良くなるように書き直すことができます(IMHO)。

ドキュメントに要素が存在する可能性がある場合と存在しない可能性があり、その要素から何かを取得したい場合は、その名前ですべての要素をクエリする方が簡単だと思います (1 つしかないことを期待して)、必要な値に射影します (この場合、url属性の値) と call SingleOrDefault(). nullこのようにして、値またはデフォルト値 (この場合) を取得します。

また、キャストを使用して要素または属性から値を読み取ると、値を読み取ろうとしたときに が取得される可能性が低くなりNullPointerExceptionます。

var items =
    from item in doc.Descendants("item")
    let enclosureUrl = item.Elements("enclosure")
        .Select(enclosure => (string)enclosure.Attribute("url"))
        .SingleOrDefault()
    select new
    {
        Guid = (string)item.Element("guid"),
        Url = enclosureUrl ?? "none",
    };
于 2012-08-18T22:33:09.923 に答える
0

私はそれが動作するxmlファイルを試してみてください

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

<items>
  <item>
    <guid>123458-7890</guid>    
  </item>
  <item>
    <guid>123456-7890</guid>
    <enclosure type="image/jpeg" url="http://example.com"/>
  </item>
</items>

xelement を取得するコード

XElement xElem2 = XElement.Load(@"C:\\XMLFile1.xml");
              var items = from xmlitems in xElem2.Descendants("item")
                          let node_enclosure = xmlitems.Element("enclosure")
                          select new
                          {
                              strImageUrl = node_enclosure == null ? "none" : node_enclosure.Attribute("url").Value,
                              strguid = xmlitems.Element("guid").Value
                          };
于 2012-08-18T22:39:31.427 に答える