0

もう解決できない問題があり、新しい洞察が必要です。キーペア値になるには、次の XML 構造が必要です。

XML

<?xml version="1.0" encoding="utf-8"?>
<data>
   <page>
     <title>Home</title>
     <url>http://data.home.nl</url>
     <page>
         <title>link 1</title>
         <url>http://data.home.nl/link1.aspx</url>
         <page>
            <title>link 2</title>
            <url>http://data.home.nl/link/link2.aspx</url>
            <page>
               <title>link 3</title>
               <url>http://data.home.nl/link/link/link3.aspx</url>
            </page>
            <page>
               <title>Test 4</title>
               <url>http://data.home.nl/link/link/test4.aspx</url>
            </page>
            <page>
               <title>Test 5</title>
               <url>http://data.home.nl/link/link/test5.aspx</url>
            </page>
            <page>
               <title>Test 6</title>
               <url>http://data.home.nl/link/link/test6.aspx</url>
            </page>
            <page>
               <title>Test 7</title>
               <url>http://data.home.nl/link/link/test7.aspx</url>
            </page>
         </page>
      </page>
   </page>
</data> 

私が達成する必要があるのは、キーペアの値であり、私は迷っています....

ありがとう!

*更新された xml 申し訳ありません

4

4 に答える 4

1

Shyju が既に指摘したように、XML は適切にフォーマットされていません。また、要素が?titleの代わりになることを意味していたと思います。それがあなたのXML文字列にあったものなので、titel私は答えで使用しました。titel

LINQ to XMLを使用して結果を達成できると思います。

var xmlString = // set your xml string here
var xml = System.Xml.Linq.XElement.Parse(xmlString);

var myDictionary = xml.Elements()
    .Select(e => new KeyValuePair<string, string>(
        e.Element("titel").Value, 
        e.Element("url").Value))
    .ToDictionary(k => k.Key, v => v.Value);

編集

質問を編集したようですが、ページは実際には階層化されています。これを処理するには、再帰を処理する LINQ 拡張メソッドを作成できます。

public static IEnumerable<T> Recursive<T>(
    this IEnumerable<T> source, 
    Func<T, IEnumerable<T>> recursiveFunc)
{
    foreach (T item in source)
    {
        yield return item;
        var result = recursiveFunc(item);

        if (result != null)
        {
            foreach (T nextItem in Recursive(result, recursiveFunc))
            {
                yield return nextItem;
            }
        }
    }
}

次に、次のように辞書を作成します。

var myDictionary = xml.Elements()
    .Recursive(e => e.Elements())
    .Where(e => e.Element("title") != null && e.Element("url") != null)
    .Select(e => new KeyValuePair<string, string>(
        e.Element("title").Value, 
        e.Element("url").Value))
    .ToDictionary(k => k.Key, v=> v.Value);
于 2012-07-18T14:16:05.217 に答える
0

XML が無効です。ここで確認できます

タイプミスであり、以下の形式の有効な XML があると仮定します。

<?xml version="1.0" encoding="utf-8"?>
<data>
    <page>
       <titel>link 3</titel>
       <url>http://data.home.nl/link/link/link3.aspx</url>
    </page>
    <page>
       <titel>Test 4</titel>
       <url>http://data.home.nl/link/link/test4.aspx</url>
    </page>           
</data>

次に、LINQtoXMLを使用してクエリを実行し、必要なことを行うことができます

Dictionary<string, string> dictionary =    new Dictionary<string, string>();

var path = Server.MapPath("~/Content/pairs.xml");

XElement elm = XElement.Load(path);
//you can also load the XML from a stream /Textreader etc..

if (elm != null)
{       
    foreach (var page in elm.Elements("page"))
    {
        var title = page.Element("titel").Value;
        var url = page.Element("url").Value;
        dictionary.Add(title, url);
    }
}
//dictionary is filled now

適切なエラー処理を追加すると確信しています(null要素にアクセスする前に、メソッドを適用するか、プロパティ値を読み取る前に常にチェックを含めます)

于 2012-07-18T14:10:56.407 に答える
0

あなたのxmlは再帰的な形です。

親子関係を保存する必要がある場合は、Dictionary の代わりに Nested Class を使用します

public class Page 
{ 
    public string Title { get; set; } 
    public string Url { get; set; } 
    public List<Page> childPage {get; set;}
} 
于 2012-07-18T15:05:23.857 に答える
0

個人的には、Page エンティティのリストを作成し、それを逆シリアル化します。

[XmlRoot(name="page"]
public class MyPage
{
    [XmlElement(name="titel")]
    public string Title { get; set; }
    [XmlElement(name="url")]
    public string Url { get; set; }
}

次に、次のように逆シリアル化します。

List<MyPage> pages;
于 2012-07-18T13:58:35.163 に答える