解决方案:
1、把头信息<?xml version='1.0' encoding='UTF-8'?>,但是内容会丢失部分;
2、用XmlDocument解析就OK。
正确代码:
string xmlStr = "<?xml version='1.0' encoding='UTF-8'?><ROOT><MAIN_BILL_ID>13905837718</MAIN_BILL_ID><PROD_ID>600000044996</PROD_ID></ROOT>";
xmlStr = "<?xml version='1.0' encoding='UTF-8'?><ROOT><MAIN_BILL_ID></MAIN_BILL_ID><DEL_BILLID_LIST><DEL_BILLID_INFO><BILL_ID>13905837765</BILL_ID><SHORT_NUM>661</SHORT_NUM></DEL_BILLID_INFO><DEL_BILLID_INFO><BILL_ID>13456381111</BILL_ID><SHORT_NUM>665</SHORT_NUM></DEL_BILLID_INFO><DEL_BILLID_INFO><BILL_ID>13819039202</BILL_ID><SHORT_NUM>662</SHORT_NUM></DEL_BILLID_INFO><DEL_BILLID_INFO><BILL_ID>15857301025</BILL_ID><SHORT_NUM>667</SHORT_NUM></DEL_BILLID_INFO><DEL_BILLID_INFO><BILL_ID>13857342868</BILL_ID><SHORT_NUM>666</SHORT_NUM></DEL_BILLID_INFO><DEL_BILLID_INFO><BILL_ID>13957366314</BILL_ID><SHORT_NUM>668</SHORT_NUM></DEL_BILLID_INFO><DEL_BILLID_INFO><BILL_ID>18267350517</BILL_ID><SHORT_NUM>669</SHORT_NUM></DEL_BILLID_INFO></DEL_BILLID_LIST></ROOT>";
StringBuilder rtn = new StringBuilder();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlStr);
XmlNodeList xmlNodeList = xmlDoc.GetElementsByTagName("ROOT");
foreach (XmlNode xmlNode in xmlNodeList)
{
//家长节点
XmlNodeList childXmlNodes1 = xmlNode.ChildNodes;
foreach (XmlNode childXmlNode1 in childXmlNodes1)
{
if (childXmlNode1.Name == "MAIN_BILL_ID")
{
string tel = childXmlNode1.InnerText;
if (rtn.Length > 0)
{
rtn.Append(",");
}
rtn.Append(tel);
}
//成员列表
XmlNodeList childXmlNodes2 = childXmlNode1.ChildNodes;
foreach (XmlNode childXmlNode2 in childXmlNodes2)
{
//成员详情
XmlNodeList childXmlNodes3 = childXmlNode2.ChildNodes;
foreach (XmlNode childXmlNode3 in childXmlNodes3)
{
if (childXmlNode3.Name == "BILL_ID" || childXmlNode3.Name == "SHORT_NUM")
{
string tel = childXmlNode3.InnerText;
if (rtn.Length > 0)
{
rtn.Append(",");
}
rtn.Append(tel);
}
}
}
}
}
Console.WriteLine(rtn.ToString());
Console.WriteLine("");
错误信息:
意外的 XML 声明。XML 声明必须是文档中的第一个节点并且在它之前不允许出现空白字符。 第 1 行,位置 41。
代码:
static void Main(string[] args)
{
string xmlStr = "<?xml version='1.0'encoding='UTF-8'?><ROOT><MAIN_BILL_ID>13905837718</MAIN_BILL_ID><PROD_ID>600000044996</PROD_ID></ROOT>";
StringBuilder rtn = new StringBuilder();
//xmlStr = xmlStr.Replace("<?xml version='1.0'encoding='UTF-8'?>", "");
if (!string.IsNullOrEmpty(xmlStr))
{
XmlReader xmlReader = null;
try
{
MemoryStream memStream = new MemoryStream();
XmlWriter writer = XmlWriter.Create(memStream);
writer.WriteRaw(xmlStr);
writer.Flush();
writer.Close();
memStream.Position = 0;
xmlReader = XmlReader.Create(memStream);
//xmlReader = XmlReader.Create(@"E:\01.xml");
while ( xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
switch (xmlReader.Name)
{
case "MAIN_BILL_ID":
string tel = xmlReader.ReadInnerXml().Trim();
if (string.IsNullOrEmpty(tel) == false)
{
rtn.Append(tel);
rtn.Append(";");
}
break;
case "BILL_ID":
tel = xmlReader.ReadInnerXml().Trim();
if (string.IsNullOrEmpty(tel) == false)
{
rtn.Append(tel);
rtn.Append(",");
}
break;
case "SHORT_NUM":
tel = xmlReader.ReadInnerXml().Trim();
if (string.IsNullOrEmpty(tel) == false)
{
rtn.Append(tel);
rtn.Append(";");
}
break;
}
}
}
}
catch (Exception ex)
{
rtn.Append(ex.Message);
}
finally
{
if (xmlReader != null)
{
xmlReader.Close();
}
}
}
Console.WriteLine(rtn.ToString());
Console.WriteLine("");
Console.ReadKey();
}