【问题标题】:C# XML parsing. Need to get textC# XML 解析。需要获取文本
【发布时间】:2017-10-13 07:13:26
【问题描述】:

我有这样的代码:

using System;
using System.IO;
using System.Xml.Serialization;

namespace ConsoleApp1
{
    [XmlRoot(ElementName = "doc")]
    public class Doc
    {
        [XmlElement(ElementName = "headline")]
        public string Headline { get; set; }
    }

    static class Program
    {
        static void Main(string[] args)
        {
            Doc res;

            var serializer = new XmlSerializer(typeof(Doc));
            using (var reader = new StringReader(File.ReadAllText("test.xml")))
            {
                res = (Doc) serializer.Deserialize(reader);
            }

            Console.Out.WriteLine(res.Headline.ToString());
        }
    }
}

我的test.xml 文件包含这样的信息:

<doc>
    <headline>AZERTY on the English <hlword>QWERTY</hlword> layout.
    </headline>
</doc>

当我尝试解析它时,我有一个异常:

System.InvalidOperationException occurred
  HResult=0x80131509
  Message=There is an error in XML document (2, 35).
  Source=System.Xml
  StackTrace:
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
   at ConsoleApp1.Program.Main(String[] args) in D:\Documents\Visual Studio 2017\Projects\ConsoleApp1\ConsoleApp1\Program.cs:line 24

Inner Exception 1:
XmlException: Unexpected node type Element. ReadElementString method can only be called on elements with simple or empty content. Line 2, position 35.

我需要从这些文件中获取AZERTY on the English &lt;hlword&gt;QWERTY&lt;/hlword&gt; layout.AZERTY on the English QWERTY layout. 的输出。我需要将什么类型设置为DocHeadline 属性才能获得这样的文本(可能需要调用ToString() 属性)?

附:我正在使用带有 VisualStudio 2017 (15.3.3) 的 Creators Update 的 Windows 10

【问题讨论】:

    标签: c# xml xml-parsing


    【解决方案1】:

    错误告诉您它无法将&lt;headline&gt;AZERTY on the English &lt;hlword&gt;QWERTY&lt;/hlword&gt; layout. 解析为简单的字符串,因为其中包含一个元素。这称为混合型。要解析这个,你需要将你的 XMLObject 编辑成这样的东西

    [XmlRoot(ElementName = "doc")]
    public class Doc
    {
        [XmlElement(ElementName = "headline")]
        public Headline Headline { get; set; }
    }
    
    public class Headline
    {
        [XmlText]
        public string Content { get; set; }
    
        [XmlElement(ElementName = "hlword")]
        public string HlWord { get; set; }
    }
    

    【讨论】:

    • 谢谢。有了这样的添加,它就可以正常工作:[XmlText] public string Content { get =&gt; _content; set =&gt; _content += value; } private string _content;
    【解决方案2】:

    您收到错误的原因是标题元素内容中的 hlword-tag。如果将内容包装在 中,则内容不会被解析,而是按原样读取。

    <doc>
        <headline><![CDATA[AZERTY on the English <hlword>QWERTY</hlword> layout.]]></headline>
    </doc>
    

    【讨论】:

    • 抱歉,我从服务器收到了这样的回答(这只是其中的简单部分)。我无法更改我的 XML
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多