0

XML ファイルからデータを読み込もうとしています

名前/名前/trckid

  • 1) たとえば、以下に貼り付けたような xml ファイルから、Names/Name/trckid を読みたいとします

  • 2) 同様に Names/Name/Files/file/uri where formatCode="2001"
    例: 結果の文字列: uri=http://cont.catalog.address.xyz.com/e2/ds/9b660964.jpg

ここに私のサンプルXMLファイルがあります

<?xml version="1.0" encoding="utf-8"?>
<Names tracking="trckids" execTime="0" xmlns="urn:schemas-microsoft-com:address:catalog">
    <Name xmlns="urn:schemas-microsoft-com:address:catalog" publishState="Published" lcid="1033" options="0" version="65" filterFlags="32687">
        <trckid ref="5ofol35" seoMetaData="/xyz/gpscatalog/">FF7eb01f7-7985-47b1-8f8c-a0e92395d00f</trckid>
        <providerId>Test0_2286326_304163829</providerId>
        <files>
            <file formatCode="2001" gpsFileId="9B660964-1626-466C-8359-F036506D8769" height="102" width="136" fileHash="4a4bcceb08b4ccdd16a958e8687c9588">
                <uri>http://cont.catalog.address.xyz.com/e2/ds/9b660964-1626-466c-8359-f036506d8769.jpg</uri>
            </file>
            <file formatCode="2007">
                <uri>http://img1.catalog.address.xyz.com/image.aspx?uuid=d7eb01f7-7985-47b1-8f8c-a0e92395d00f&amp;w=136&amp;h=102</uri>
            </file>
            <file formatCode="2200" gpsFileId="6C34F723-D798-4DA8-AEE4-0442C239D3A0" fileSize="311469" height="180" width="320"                                                                             sourceFileHash="6ea74770f622e3e0dc9cf5e229c7de7f">
                <uri>http://cont.catalog.address.xyz.com/e2/ds/0909a015-4b6a-4574-be63-c2facd527b9f_0.xml</uri>
            </file>
        </files>
    </Name>
   <Name xmlns="urn:schemas-microsoft-com:address:catalog" publishState="Published" lcid="1033" options="0" version="65" filterFlags="32687">
        <trckid ref="5ofol20" seoMetaData="/xyz/gpscatalog/">FF9eb01f7-7985-47b1-8f8c-a0e92395d00f</trckid>
        <providerId>Test1TheLorax_2286326_304163829</providerId>
        <files>
            <file formatCode="2001" gpsFileId="9B660964-1626-466C-8359-F036506D8769" height="102" width="136" fileHash="4a4bcceb08b4ccdd16a958e8687c9588">
                <uri>http://cont.catalog.address.xyz.com/e2/ds/9b660964-1626-466c-8359-f036506d8769.jpg</uri>
            </file>
            <file formatCode="2007">
                <uri>http://img1.catalog.address.xyz.com/image.aspx?uuid=d7eb01f7-7985-47b1-8f8c-a0e92395d00f&amp;w=136&amp;h=102</uri>
            </file>
            <file formatCode="2200" gpsFileId="6C34F723-D798-4DA8-AEE4-0442C239D3A0" fileSize="311469" height="180" width="320"                                                                             sourceFileHash="6ea74770f622e3e0dc9cf5e229c7de7f">
                <uri>http://cont.catalog.address.xyz.com/e2/ds/0909a015-4b6a-4574-be63-c2facd527b9f_0.xml</uri>
            </file>
        </files>
    </Name>
</Names>

以下のコードで試しました

      XDocument xdoc = XDocument.Parse(xmlstring);
            XNamespace ns = xdoc.Root.GetDefaultNamespace();  // "urn:schemas-microsoft-com:msnvideo:catalog";
            IEnumerable<XElement> names = xdoc.Descendants(ns + "name");
   foreach (XElement name in names)
            {


                 rssFeedItems.Add(new Adressses
                    {
                    trackid=  Convert.ToString(name.Element(ns + "trackid").Value),
                    providerID= Convert.ToString(name.Element(ns + "provideid").Value),

                    imageUri = Convert.ToString(name.Element(ns + "uri").Value)
                    });

            }        
  Here  am able to read first two items ,ie, trackid and providerID ,but not the image uri

Names/Name/files/file@formatcode[2001]/uri に一致する uri を読み取る必要があります

何かのようなもの

 imageUri = Convert.ToString(name.Element(ns + "Names/Name/files/file@formatcode[2001]/uri").Value)

しかし、これはうまくいきません。助けてください

4

3 に答える 3

2

まず、xml が無効です。終了タグは、</Names>代わりに次のようになります。<Names/>

次に、名前空間宣言を追加する必要があります。このような:

    XNamespace cat = "urn:schemas-microsoft-com:address:catalog";
    XNamespace add = "urn:schemas-microsoft-com:msnvideo:address";
    XDocument doc = XDocument.Parse(xdata);
    var firstTrck = doc.Element(cat + "Names").Elements(add + "Name").First().Element(add + "trckid");
    var val = firstTrck.Value;

また、1 つまたは複数の要素を探していることを確認するために、Element/Elements に (s) を追加する方法に注意してください。

要素コレクションを反復処理する方法は次のとおりです。

        XNamespace cat = "urn:schemas-microsoft-com:address:catalog";
        XNamespace add = "urn:schemas-microsoft-com:msnvideo:address";
        XDocument doc = XDocument.Parse(xdata);

        var xNames = doc.Element(cat + "Names").Elements(add + "Name");
        foreach (var xName in xNames)
        {
            var trackingId = xName.Element(add + "trckid").Value;

            var xFiles = xName.Element(add + "files").Elements(add + "file").Where(xe => (string)xe.Attribute("formatCode") == "2001");
            foreach (var xFile in xFiles)
            {
                var uri = xFile.Element(add + "uri").Value;
            }
        }

これをデバッグすると、"Name" 要素の 1 つだけがコレクションに表示されることに注意してください。これは、それぞれのxmlns宣言が一致しないためです。

于 2012-04-27T00:56:05.380 に答える
1

これはあなたが探しているものになると思います。

XmlDocument doc = new XmlDocument();
WebClient webClient = new WebClient();
string xmlstring = webClient.DownloadString(url);
doc.LoadXml(xmlstring);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("ns", "urn:schemas-microsoft-com:address:catalog");
foreach (XmlNode n in doc.SelectNodes("/ns:Names/ns:Name/ns:trckid/@ref", nsMgr))
{
    Console.WriteLine(String.Format("trckid: {0}", n.InnerText));
}
foreach (XmlNode n in doc.SelectNodes("/ns:Names/ns:Name/ns:files/ns:file[@formatCode='2001']/ns:uri", nsMgr))
{
    Console.WriteLine(String.Format("uri: {0}", n.InnerText));
}
于 2012-04-27T02:47:11.963 に答える
-1

各行を文字列配列に読み取ってから、探しているプレフィックスを含む行を検索してみませんか。前面と背面を剥がして、変数に格納します..それでうまくいきますか?

于 2012-04-27T00:22:24.320 に答える