使用标记<m:properties> c#</m:properties>解析XML

时间:2013-01-22 14:56:58

标签: c# xml xml-parsing

我想解析这个XML:

<?xml version="1.0" encoding="utf-8" ?>
<feed xml:base="http://staging.bradinsight.win.web.emap-intl.net/ALFAPI/AlfWebApi/"
xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <id>http://staging.bradinsight.win.web.emap-intl.net/alfapi/alfwebapi/AuthenticationToken</id>
    <title
    type="text">AuthenticationToken</title>
        <updated>2013-01-22T13:07:10Z</updated>
        <link rel="self" title="AuthenticationToken"
        href="AuthenticationToken" />
        <entry>
            <id>http://staging.bradinsight.win.web.emap-intl.net/ALFAPI/AlfWebApi/AuthenticationToken(1)</id>
            <category
            term="AlfWebApiInfrastructure.Poco.AuthenticationToken" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"
            />
            <link rel="edit" title="AuthenticationToken" href="AuthenticationToken(1)"
            />
            <title />
            <updated>2013-01-22T13:07:10Z</updated>
            <author>
                <name />
            </author>
            <content type="application/xml">
                <m:properties>
                    <d:AuthenticationTokenId m:type="Edm.Int32">1</d:AuthenticationTokenId>
                    <d:IsValid m:type="Edm.Boolean">true</d:IsValid>
                    <d:Message>Success</d:Message>
                    <d:Token>B50F114BF0BE2B7B210132B1D188DAD8AD6719D808BD59D800509A951C4FB7445687E4F75FCE22C52219495D5172AFFB0FB20FE4E949D20CA0F5055D7F9237C6B5EA4028692A63A2AB0E1703C4668EE2D4C58473A58F1B25AC8ADE4DE12B2A7581064217C5040EDB3A4E302DA1714F21BBEA7D82748B4DF9524C5FED6ED7E265
                        <
                        /d:Token>
                </m:properties>
            </content>
        </entry>

使用此代码:

 WebRequest wrGETURL;
 wrGETURL = WebRequest.Create(sURL);

  StringBuilder output = new StringBuilder();

  Stream objStream;
      try
        {
            objStream = wrGETURL.GetResponse().GetResponseStream();

            StreamReader objReader = new StreamReader(objStream);

                // Create an XmlReader
                using (XmlReader reader = XmlReader.Create(new StringReader(objReader.ReadToEnd())))
                {
                    XmlWriterSettings ws = new XmlWriterSettings();
                    ws.Indent = true;
                    using (XmlWriter writer = XmlWriter.Create(output, ws))
                    {

                        // Parse the file and display each of the nodes.
                        while (reader.Read())
                        {
                            switch (reader.NodeType)
                            {
                                case XmlNodeType.Element:
                                    writer.WriteStartElement(reader.Name);
                                    break;
                                case XmlNodeType.Text:
                                    writer.WriteString(reader.Value);
                                    break;
                                case XmlNodeType.XmlDeclaration:
                                case XmlNodeType.ProcessingInstruction:
                                    writer.WriteProcessingInstruction(reader.Name, reader.Value);
                                    break;
                                case XmlNodeType.Comment:
                                    writer.WriteComment(reader.Value);
                                    break;
                                case XmlNodeType.EndElement:
                                    writer.WriteFullEndElement();
                                    break;
                            }
                        }

                    }
                }

但是我的C#代码无法解析标签。

我收到此错误:

{System.ArgumentException: Invalid name character in 'm:properties'. The ':' character, hexadecimal value 0x3A, cannot be included in a name.
   at System.Xml.XmlWellFormedWriter.CheckNCName(String ncname)
   at System.Xml.XmlWellFormedWriter.WriteStartElement(String prefix, String localName, String ns)
   at System.Xml.XmlWriter.WriteStartElement(String localName)
   at AlfApi.Controllers.HomeController.Index() in c:\users\nickgowdy\documents\visual studio 2010\Projects\AlfApi\AlfApi\Controllers\HomeController.cs:line 51}

有谁知道如何解析这个xml?

谢谢!

2 个答案:

答案 0 :(得分:0)

尝试用以下代码替换您的代码:

case XmlNodeType.Element:
    writer.WriteStartElement(reader.Name.Substring(Math.Max(0,reader.Name.IndexOf(":") + 1)));
    break;

此外,在while循环后,使用Flush()方法,如下所示:

while (reader.Read())
{
    //process
}
writer.Flush();

或者只是使用:

writer.WriteStartElement(reader.LocalName)

答案 1 :(得分:0)

标记名称中的m:表示xml名称空间。因此,要解析xml,您需要声明名称空间 - 在c#中,这是通过XmlNamespaceManager完成的。

为读者尝试这样的事情

// Create an XmlReader
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace("m", "www.namespacem.com"); // Placeholder uri
nsmgr.AddNamespace("d", "www.namespaced.com"); // Placeholder uri
XmlParserContext context = new XmlParserContext(nt, nsmgr, null, XmlSpace.None);
using (XmlReader reader = XmlReader.Create(new StringReader(x), new XmlReaderSettings(), context))
{
    // Do funky stuff
}

此外,您需要修改您的编写器以允许名称空间,例如:

writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);