【问题标题】:c# parse string to xml using StringReaderc# 使用StringReader将字符串解析为xml
【发布时间】:2019-02-02 07:35:39
【问题描述】:

我有一个XML,并将其加载到class

这是我的XML

<out_policySystem xmlns:msl="http://www.ibm.com/xmlmap" xmlns:io="" xmlns:xs4xs="http://www.w3.org/2001/XMLSchema">
  <BGBAResultadoOperacion>
    <Severidad>OK</Severidad>
  </BGBAResultadoOperacion>
  <permiteOperar>true</permiteOperar>
  <Lista xmlns:ns0=\"http://CalypsoPolicySystem_lib/service\">
    <Codigo>ODM-006</Codigo>
    <Descripcion>Aviso</Descripcion>
    <DescripcionTecnica>XXXX</DescripcionTecnica>
  </Lista>
</out_policySystem>

我已经这样定义了我的类。

    [XmlRoot(ElementName = "out_policySystem")]
    public partial class output_policySystem
    {
        public BGBAResultadoOperacion BGBAResultadoOperacion { get; set; }
        public bool permiteOperar { get; set; }
       public List[] Lista { get; set; }
    }
      public partial class BGBAResultadoOperacion
    {
        public string Severidad { get; set; }
    }
     public partial class List
    {
        public string Codigo { get; set; }
        public string Descripcion { get; set; }
        public string DescripcionTecnica { get; set; }
    }

我是这样读的。

 XmlNodeList elemlist = xDoc.GetElementsByTagName("out_policySystem");
 string result = elemlist[0].InnerXml;
 XmlSerializer serializer = new XmlSerializer(typeof(BGBAResultadoOperacion));

 using (StringReader reader = new StringReader(result))
 {
 result = (BGBAResultadoOperacion)(serializer.Deserialize(reader));
 }

result 的值是这个。

<BGBAResultadoOperacion><Severidad>OK</Severidad></BGBAResultadoOperacion><permiteOperar>true</permiteOperar><Lista><Codigo>ODM-006</Codigo><Descripcion>Aviso</Descripcion><DescripcionTecnica>xxxx</DescripcionTecnica></Lista>

我需要的是获取 BGBAResultadoOperacion 的值

当我设置时

using (StringReader reader = new StringReader(result))
     {
     result = (BGBAResultadoOperacion)(serializer.Deserialize(reader));
     }

结果得到 XML 错误...

There are multiple root elements. Line 1, position 76.

XML 节点 out_policySystem 内部包含三个根元素。我只需要解析BGBAResultadoOperacion

我怎样才能得到它?

谢谢

【问题讨论】:

  • 异常的堆栈跟踪是什么?
  • 我添加了内部异常......它说有多个根元素。第 1 行,位置 76。谢谢
  • 你需要阅读整个xml。 xml 序列化需要一个格式良好的 xml 文件,这意味着您只能有一个根元素。您正在删除元素 out_policySystem 这是错误的原因,然后在根处给出三个元素。

标签: c# xml class stringreader


【解决方案1】:

那是因为这条线:

elemlist[0].InnerXml

它返回一个 XML 片段,而不是一个 XML 文档。

  <BGBAResultadoOperacion>
    <Severidad>OK</Severidad>
  </BGBAResultadoOperacion>
  <permiteOperar>true</permiteOperar>
  <Lista xmlns:ns0=\"http://CalypsoPolicySystem_lib/service\">
    <Codigo>ODM-006</Codigo>
    <Descripcion>Aviso</Descripcion>
    <DescripcionTecnica>XXXX</DescripcionTecnica>
  </Lista>

因此,要么使用 .OuterXML,要么使用 XElement.CreateReader(),如此处答案所述:Serialize an object to XElement and Deserialize it in memory

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多