亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何解析帶有嵌套 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貢獻1775條經驗 獲得超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貢獻1864條經驗 獲得超2個贊

<?xml ...?>處理聲明僅在 XML 文檔的第一行有效,因此您得到的 XML 不是格式正確的 XML 。這將使在不更改源文檔(并且您已經指出這是不可能的)或預處理源文檔的情況下很難按原樣進行解析。

你可以試試:

  1. 用正則表達式或字符串操作剝離<?xml ?>指令,但那里的治療可能比疾病更糟糕。

  2. 實現更寬容的解析器的 HTMLAgilityPack可以處理 XML 文檔

除此之外,文檔的制作者應該著眼于生成格式良好的 XML:

  1. CDATAsections 可以幫助做到這一點,但請注意CDATA不能包含]]>結束標記。

  2. 轉義 XML 文本的 XML 可以正常工作;也就是說,使用標準例程來<轉換&lt;等等。

  3. XML 命名空間在這里也可以提供幫助,但一開始它們可能會讓人望而生畏。


查看完整回答
反對 回復 2022-11-21
  • 2 回答
  • 0 關注
  • 303 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號