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

尝试读取带有嵌套 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 的创建。


陪伴而非守候
浏览 365回答 2
2回答

繁星淼淼

我知道的唯一方法是摆脱非法的第二次<?xml>声明。我写了一个示例,它将简单地查找并丢弃第二个<?xml>. 之后该字符串成为有效的 XML 并且可以被解析。您可能需要稍微调整一下以使其适用于您的具体情况。代码:using System;using System.Xml;public class Program{&nbsp; &nbsp; public static void Main()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var badXML = @"<?xml version=""1.0"" encoding=""UTF-8""?><Data>&nbsp; <Items>&nbsp; &nbsp; <Item>&nbsp; &nbsp; &nbsp; <Target type=""System.String"">Some target</Target>&nbsp; &nbsp; &nbsp; <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>&nbsp; &nbsp; </Item>&nbsp; </Items></Data>";&nbsp; &nbsp; &nbsp; &nbsp; var goodXML = badXML.Replace(@"<Content type=""System.String""><?xml version=""1.0"" encoding=""utf-8""?>"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;, @"<Content type=""System.String"">");&nbsp; &nbsp; &nbsp; &nbsp; var xmlDoc = new XmlDocument();&nbsp; &nbsp; &nbsp; &nbsp; xmlDoc.LoadXml(goodXML);&nbsp; &nbsp; &nbsp; &nbsp; XmlNodeList itemRefList = xmlDoc.GetElementsByTagName("Content");&nbsp; &nbsp; &nbsp; &nbsp; foreach (XmlNode xn in itemRefList)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(xn.InnerXml);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}输出:<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 包装在一个块中,那么就不需要所有这些了。

慕斯王

<?xml ...?>处理声明仅在 XML 文档的第一行有效,因此您得到的 XML 不是格式正确的 XML&nbsp;。这将使在不更改源文档(并且您已经指出这是不可能的)或预处理源文档的情况下很难按原样进行解析。你可以试试:用正则表达式或字符串操作剥离<?xml ?>指令,但那里的治疗可能比疾病更糟糕。实现更宽容的解析器的 HTMLAgilityPack可以处理 XML 文档除此之外,文档的制作者应该着眼于生成格式良好的 XML:CDATAsections 可以帮助做到这一点,但请注意CDATA不能包含]]>结束标记。转义 XML 文本的 XML 可以正常工作;也就是说,使用标准例程来<转换&lt;等等。XML 命名空间在这里也可以提供帮助,但一开始它们可能会让人望而生畏。
打开App,查看更多内容
随时随地看视频慕课网APP