【问题标题】:How can I access XML inside a namespace using XML to LINQ如何使用 XML to LINQ 访问命名空间内的 XML
【发布时间】:2013-06-16 08:54:41
【问题描述】:

我有以下 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>

我想访问&lt;d:Title&gt;yy&lt;/d:Title&gt; 的值

这是 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.

【问题讨论】:

    标签: .net xml linq linq-to-xml


    【解决方案1】:

    您似乎正在尝试解析联合供稿。我建议您为此使用适当的工具-> 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);
            }
        }
    }
    

    注意您需要如何使用适当的 XNamespace 才能选择自定义 &lt;d:Title&gt; 元素。

    如果您不想使用 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);            
    }
    

    【讨论】:

    • 谢谢。我使用了这段代码并更新了问题。但我仍然收到一条错误消息,提示“第 5 行位置 3 出错。解析 XML 中的 DateTime 值时遇到错误。”我还用我的确切 xml 更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多