1

次の XML があります。

   <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://x.table.core.windows.net/" 
      xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
      xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
      xmlns="http://www.w3.org/2005/Atom">
    <title type="text">TestContents</title>
    <updated />
    <link rel="self" title="TestContents" href="TestContents" />

    <entry>
        <title type="text" />
        <updated />
        <author>
            <name />
        </author>
        <link rel="edit"  />
        <content type="application/xml">
            <m:properties>
                <d:Title>ssq</d:Title>
                <d:Type>1</d:Type>
            </m:properties>
        </content>
    </entry>
    <entry>
        <title type="text" />
        <updated />
        <author>
            <name />
        </author>
        <link rel="edit"  />
        <content type="application/xml">
            <m:properties>
                <d:Title>yy</d:Title>
                <d:Type>1</d:Type>
            </m:properties>
        </content>
    </entry>
    <entry>
        <title type="text" />
        <updated />
        <author>
            <name />
        </author>
        <link rel="edit" />
        <content type="application/xml">
            <m:properties>
                <d:Title>xx</d:Title>
                <d:Type>1</d:Type>
            </m:properties>
        </content>
    </entry>
</feed>

の値にアクセスしたい<d:Title>yy</d:Title>

Darinが提案したコードは次のとおりです。

    static void Main(string[] args) {

        XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
        using (var reader = XmlReader.Create(@"c:\data\contents2.xml"))
        {
            var feed = SyndicationFeed.Load(reader);
            foreach (var item in feed.Items)
            {
                var content = item.Content as XmlSyndicationContent;
                if (content != null)
                {
                    var value = content.ReadContent<XElement>();
                    var text = value.Element(d + "Title");
                    Console.WriteLine(text.Value);
                }
            }
            Console.ReadLine();
        }
    }

しかし、これを実行すると、エラーが発生するだけです

Error in line 5 position 3. An error was encountered when parsing a DateTime value in the XML.
4

1 に答える 1

3

シンジケーション フィードを解析しようとしているようです。そのために適切なツールを使用することをお勧めします -> SyndicationFeed:

XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
using (var reader = XmlReader.Create("test.xml"))
{
    var feed = SyndicationFeed.Load(reader);
    foreach (var item in feed.Items)
    {
        var content = item.Content as XmlSyndicationContent;
        if (content != null)
        {
            var value = content.ReadContent<XElement>();
            var text = value.Element(d + "Title");
            Console.WriteLine(text.Value);
        }
    }
}

<d:Title>カスタム要素を選択するには、適切な XNamespace を使用する必要があることに注意してください。

SyndicationFeed クラスを使用したくない場合は、Linq to XML を使用して手動で XML を解析できます。

XNamespace a = "http://www.w3.org/2005/Atom";
XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
XElement feed = XElement.Load("test.xml");
var titles =
    from entry in feed.Descendants(a + "entry")
    let content = entry.Element(a + "content")
    let properties = content.Element(m + "properties")
    let title = properties.Element(d + "Title")
    select title;

foreach (var title in titles)
{
    Console.WriteLine(title.Value);            
}
于 2013-06-16T09:06:02.487 に答える