为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析带有嵌套 XML 文本的 XML

如何解析带有嵌套 XML 文本的 XML

C#
陪伴而非守候 2022-11-21 22:08:48

尝试读取带有嵌套 XML 对象和自己的 XML 声明的 XML 文件。正如预期的那样有异常: Unexpected XML declaration. The XML declaration must be the first node in the document, and no white space characters are allowed to appear before it.


我如何将该特定元素作为文本读取并将其解析为单独的 XML 文档以供以后反序列化?


<?xml version="1.0" encoding="UTF-8"?>

<Data>

  <Items>

    <Item>

      <Target type="System.String">Some target</Target>

      <Content type="System.String"><?xml version="1.0" encoding="utf-8"?><Data><Items><Item><surname type="System.String">Some Surname</surname><name type="System.String">Some Name</name></Item></Items></Data></Content>

    </Item>

  </Items>

</Data>

由于声明异常,我尝试的每种方法都失败了。


    var xml = System.IO.File.ReadAllText("Info.xml");


    var xDoc = XDocument.Parse(xml); // Exception


    var xmlDoc = new XmlDocument();

    xmlDoc.LoadXml(xml); // Exception


    var xmlReader = XmlReader.Create(new StringReader(xml));

    xmlReader.ReadToFollowing("Content"); // Exception

我无法控制 XML 的创建。


查看完整描述

2 回答

?
繁星淼淼

TA贡献1481条经验 获得超11个赞

我知道的唯一方法是摆脱非法的第二次<?xml>声明。我写了一个示例,它将简单地查找并丢弃第二个<?xml>. 之后该字符串成为有效的 XML 并且可以被解析。您可能需要稍微调整一下以使其适用于您的具体情况。


代码:


using System;

using System.Xml;


public class Program

{

    public static void Main()

    {

        var badXML = @"<?xml version=""1.0"" encoding=""UTF-8""?>

<Data>

  <Items>

    <Item>

      <Target type=""System.String"">Some target</Target>

      <Content type=""System.String""><?xml version=""1.0"" encoding=""utf-8""?><Data><Items><Item><surname type=""System.String"">Some Surname</surname><name type=""System.String"">Some Name</name></Item></Items></Data></Content>

    </Item>

  </Items>

</Data>";


        var goodXML = badXML.Replace(@"<Content type=""System.String""><?xml version=""1.0"" encoding=""utf-8""?>"

                                   , @"<Content type=""System.String"">");


        var xmlDoc = new XmlDocument();

        xmlDoc.LoadXml(goodXML);


        XmlNodeList itemRefList = xmlDoc.GetElementsByTagName("Content");

        foreach (XmlNode xn in itemRefList)

        {

            Console.WriteLine(xn.InnerXml);

        }

    }

}

输出:


<Data><Items><Item><surname type="System.String">Some Surname</surname><name type="System.String">Some Name</name></Item></Items></Data>

工作 DotNetFiddle:https ://dotnetfiddle.net/ShmZCy


<![CDATA[ .... ]]>也许不用说:如果创建这个无效 XML 的东西应用通用规则将嵌套的 XML 包装在一个块中,那么就不需要所有这些了。


查看完整回答
反对 回复 2022-11-21
?
慕斯王

TA贡献0条经验 获得超1个赞

<?xml ...?>处理声明仅在 XML 文档的第一行有效,因此您得到的 XML 不是格式正确的 XML 。这将使在不更改源文档(并且您已经指出这是不可能的)或预处理源文档的情况下很难按原样进行解析。

你可以试试:

  1. 用正则表达式或字符串操作剥离<?xml ?>指令,但那里的治疗可能比疾病更糟糕。

  2. 实现更宽容的解析器的 HTMLAgilityPack可以处理 XML 文档

除此之外,文档的制作者应该着眼于生成格式良好的 XML:

  1. CDATAsections 可以帮助做到这一点,但请注意CDATA不能包含]]>结束标记。

  2. 转义 XML 文本的 XML 可以正常工作;也就是说,使用标准例程来<转换&lt;等等。

  3. XML 命名空间在这里也可以提供帮助,但一开始它们可能会让人望而生畏。


查看完整回答
反对 回复 2022-11-21
  • 2 回答
  • 0 关注
  • 11 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信