当xmlns属性存在时,如何将xml解析为C#类?

时间:2017-07-19 18:01:42

标签: c# xml console-application

一直在坚持这个,我的xml:

<?xml version="1.0"?>
<ArrayOfWorItems xmlns="http://someUrl" xmlns:i="http://www.w3.org/">
<WorkItem>
    <ItemID>596</ItemID>
    <ItemPressure>35.0000</ItemPressure>
    <ItemTableID>14</ItemTableID>
    <ItemVersion>AAAAAAAADGQ=</ItemVersion>
    <ItemTemperature>-196.0000</ItemTemperature>
</WorkItem>
<WorkItem>
    <ItemID>596</ItemID>
    <ItemPressure>35.0000</ItemPressure>
    <ItemTableID>14</ItemTableID>
    <ItemVersion>AAAAAAAADGQ=</ItemVersion>
    <ItemTemperature>-196.0000</ItemTemperature>
</WorkItem>
<WorkItem>
    <ItemID>596</ItemID>
    <ItemPressure>35.0000</ItemPressure>
    <ItemTableID>14</ItemTableID>
    <ItemVersion>AAAAAAAADGQ=</ItemVersion>
    <ItemTemperature>-196.0000</ItemTemperature>
</WorkItem>
    <WorkItem>
    <ItemID>596</ItemID>
    <ItemPressure>35.0000</ItemPressure>
    <ItemTableID>14</ItemTableID>
    <ItemVersion>AAAAAAAADGQ=</ItemVersion>
    <ItemTemperature>-196.0000</ItemTemperature>
</WorkItem>

</ArrayOfWorItems>

我想解析一下这个问题:

[XmlRoot("ArrayOfWorItems")]
public class ArrayOfWorItems
{
    public List<WorkItem> WorkItem { get; set; }
}

逻辑:

    var doc = new XmlDataDocument();

    doc.Load(path);


    XmlNamespaceManager xmlNS = new XmlNamespaceManager(doc.NameTable);

    xmlNS.AddNamespace("stupid_xmlns", @"http://someUrl");

    string contents = doc.OuterXml;

    MyXmlHandler handler = new MyXmlHandler();

    var t = handler.ParseXml<ArrayOfWorItems>(contents);

解析方法:

    public T ParseXml<T>(string  xmlStream)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        using (StringReader reader = new StringReader(xmlStream))
        {
            var items  = (T)(serializer.Deserialize(reader));

            return items;
        }
    }

错误:

  

InnerException = {“http:// someUrl'&gt;不是   预期。”}   Message =“XML文档中存在错误(1,23)。”

已经有一段时间了,无法弄明白, 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

还需要使用Namespace属性指定Root类。

[XmlRoot("ArrayOfWorItems", Namespace = "http://someUrl")]

答案 1 :(得分:0)

在与朋友协商后,我设法让所有这些都得到了解决。

@Gowri Pranith从一开始我的资金实际上是正确的,但是我输入了错误的命名空间,一旦我发现了我还有另一个问题:

我用于解析json对象,因此解析时逻辑不同。 我的朋友告诉我,我的父类中没有list属性,因为xml没有像解析json时那样处理它,正确的方法是:

[XmlRoot("ArrayOfWorItems", Namespace = "http://someUrl")]
public class ArrayOfWorItems: List<WorkItem>
{
}

父类继承列表,解析器将它们呈现为子项