如何将字符串 XML 转换为 C# 对象,只读取文档的内部部分。

huangapple go评论99阅读模式
英文:

How to convert string xml into C# Object reading only inner part of the document

问题

I am working on an application where I need to convert string XML into C# object but I am receiving following error.

> There is an error in XML document (1, 23)
> InvalidOperationException: <root xmlns=''> was not expected.

Here is my XML

  1. &lt;root&gt;
  2. &lt;main&gt;
  3. &lt;url&gt;https://w3.kubotalink.com/KLWebServices/services/DealerInventorySOAP&lt;/url&gt;
  4. &lt;timeout&gt;80&lt;/timeout&gt;
  5. &lt;financialuploaddealernumber&gt;50057&lt;/financialuploaddealernumber&gt;
  6. &lt;ikqunitcategories&gt;2,3,4,5,6,7,8,9,10,11,12&lt;/ikqunitcategories&gt;
  7. &lt;ikqdebuglogenabled&gt;true&lt;/ikqdebuglogenabled&gt;
  8. &lt;adminuserid&gt;128&lt;/adminuserid&gt;
  9. &lt;locatoradminuserid&gt;120&lt;/locatoradminuserid&gt;
  10. &lt;warrantyenabled&gt;true&lt;/warrantyenabled&gt;
  11. &lt;warrantyusernameproduction&gt;integration@chartersoftware.com.ktc&lt;/warrantyusernameproduction&gt;
  12. &lt;warrantypasswordproduction&gt;KubotaWarranty-1&lt;/warrantypasswordproduction&gt;
  13. &lt;warrantyusernamestaging&gt;integration@chartersoftware.com.ktc.uat&lt;/warrantyusernamestaging&gt;
  14. &lt;warrantypasswordstaging&gt;Ktcwarranty1&lt;/warrantypasswordstaging&gt;
  15. &lt;warrantytestmode&gt;true&lt;/warrantytestmode&gt;
  16. &lt;/main&gt;
  17. &lt;locationsettings&gt;
  18. &lt;row&gt;
  19. &lt;dealerid&gt;51760&lt;/dealerid&gt;
  20. &lt;locationid&gt;1&lt;/locationid&gt;
  21. &lt;passkey&gt;kubota &lt;/passkey&gt;
  22. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  23. &lt;ikquserid&gt;ikqTest1&lt;/ikquserid&gt;
  24. &lt;ikqpass&gt;qwerty&lt;/ikqpass&gt;
  25. &lt;ikqsalespersonid&gt;144&lt;/ikqsalespersonid&gt;
  26. &lt;ikqcustomerid&gt;4&lt;/ikqcustomerid&gt;
  27. &lt;ikqcustomerno&gt;ABBOTT TOM&lt;/ikqcustomerno&gt;
  28. &lt;ikqmiscchargeid&gt;16&lt;/ikqmiscchargeid&gt;
  29. &lt;ikqmiscchargename&gt;SETUP&lt;/ikqmiscchargename&gt;
  30. &lt;ikqunitcategoryid&gt;11&lt;/ikqunitcategoryid&gt;
  31. &lt;createpackingslips&gt;true&lt;/createpackingslips&gt;
  32. &lt;/row&gt;
  33. &lt;row&gt;
  34. &lt;dealerid&gt;51760&lt;/dealerid&gt;
  35. &lt;locationid&gt;2&lt;/locationid&gt;
  36. &lt;passkey&gt;family2014&lt;/passkey&gt;
  37. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  38. &lt;ikquserid /&gt;
  39. &lt;ikqpass /&gt;
  40. &lt;ikqsalespersonid&gt;-2147483648&lt;/ikqsalespersonid&gt;
  41. &lt;ikqcustomerid&gt;-2147483648&lt;/ikqcustomerid&gt;
  42. &lt;ikqcustomerno /&gt;
  43. &lt;ikqmiscchargeid&gt;-2147483648&lt;/ikqmiscchargeid&gt;
  44. &lt;ikqmiscchargename /&gt;
  45. &lt;ikqunitcategoryid&gt;-2147483648&lt;/ikqunitcategoryid&gt;
  46. &lt;createpackingslips&gt;true&lt;/createpackingslips&gt;
  47. &lt;/row&gt;
  48. &lt;row&gt;
  49. &lt;dealerid&gt;51760&lt;/dealerid&gt;
  50. &lt;locationid&gt;3&lt;/locationid&gt;
  51. &lt;passkey&gt;family2014&lt;/passkey&gt;
  52. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  53. &lt;ikquserid /&gt;
  54. &lt;ikqpass /&gt;
  55. &lt;ikqsalespersonid&gt;-2147483648&lt;/ikqsalespersonid&gt;
  56. &lt;ikqcustomerid&gt;-2147483648&lt;/ikqcustomerid&gt;
  57. &lt;ikqcustomerno /&gt;
  58. &lt;ikqmiscchargeid&gt;-2147483648&lt;/ikqmiscchargeid&gt;
  59. &lt;ikqmiscchargename /&gt;
  60. &lt;ikqunitcategoryid&gt;-2147483648&lt;/ikqunitcategoryid&gt;
  61. &lt;createpackingslips&gt;true&lt;/createpackingslips&gt;
  62. &lt;/row&gt;
  63. &lt;row&gt;
  64. &lt;dealerid&gt;48375&lt;/dealerid&gt;
  65. &lt;locationid&gt;6&lt;/locationid&gt;
  66. &lt;passkey&gt;charterkub1&lt;/passkey&gt;
  67. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  68. &lt;ikquserid /&gt;
  69. &lt;ikqpass /&gt;
  70. &lt;ikqsalespersonid&gt;-2147483648&lt;/ikqsalespersonid&gt;
  71. &lt;ikqcustomerid&gt;-2147483648&lt;/ikqcustomerid&gt;
  72. &lt;ikqcustomerno /&gt;
  73. &lt;ikqmiscchargeid&gt;-2147483648&lt;/ikqmiscchargeid&gt;
  74. &lt;ikqmiscchargename /&gt;
  75. &lt;ikqunitcategoryid&gt;-2147483648&lt;/ikqunitcategoryid&gt;
  76. &lt;createpackingslips&gt;false&lt;/createpackingslips&gt;
  77. &lt;/row&gt;
  78. &lt;row&gt;
  79. &lt;dealerid&gt;51760&lt;/dealerid&gt;
  80. &lt;locationid&gt;8&lt;/locationid&gt;
  81. &lt;passkey&gt;family2014&lt;/passkey&gt;
  82. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  83. &lt;ikquserid /&gt;
  84. &lt;ikqpass /&gt;
  85. &lt;ikqsalespersonid&gt;-2147483648&lt;/ikqsalespersonid&gt;
  86. &lt;ikqcustomerid&gt;-2147483648&lt;/ikqcustomerid&gt;
  87. &lt;ikqcustomerno /&gt;
  88. &lt;ikqmiscchargeid
英文:

I am working on an application where I need to convert string XML into C# object but I am receiving following error.

> There is an error in XML document (1, 23)
> InvalidOperationException: <root xmlns=''> was not expected.

Here is my XML

  1. &lt;root&gt;
  2. &lt;main&gt;
  3. &lt;url&gt;https://w3.kubotalink.com/KLWebServices/services/DealerInventorySOAP&lt;/url&gt;
  4. &lt;timeout&gt;80&lt;/timeout&gt;
  5. &lt;financialuploaddealernumber&gt;50057&lt;/financialuploaddealernumber&gt;
  6. &lt;ikqunitcategories&gt;2,3,4,5,6,7,8,9,10,11,12&lt;/ikqunitcategories&gt;
  7. &lt;ikqdebuglogenabled&gt;true&lt;/ikqdebuglogenabled&gt;
  8. &lt;adminuserid&gt;128&lt;/adminuserid&gt;
  9. &lt;locatoradminuserid&gt;120&lt;/locatoradminuserid&gt;
  10. &lt;warrantyenabled&gt;true&lt;/warrantyenabled&gt;
  11. &lt;warrantyusernameproduction&gt;integration@chartersoftware.com.ktc&lt;/warrantyusernameproduction&gt;
  12. &lt;warrantypasswordproduction&gt;KubotaWarranty-1&lt;/warrantypasswordproduction&gt;
  13. &lt;warrantyusernamestaging&gt;integration@chartersoftware.com.ktc.uat&lt;/warrantyusernamestaging&gt;
  14. &lt;warrantypasswordstaging&gt;Ktcwarranty1&lt;/warrantypasswordstaging&gt;
  15. &lt;warrantytestmode&gt;true&lt;/warrantytestmode&gt;
  16. &lt;/main&gt;
  17. &lt;locationsettings&gt;
  18. &lt;row&gt;
  19. &lt;dealerid&gt;51760&lt;/dealerid&gt;
  20. &lt;locationid&gt;1&lt;/locationid&gt;
  21. &lt;passkey&gt;kubota &lt;/passkey&gt;
  22. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  23. &lt;ikquserid&gt;ikqTest1&lt;/ikquserid&gt;
  24. &lt;ikqpass&gt;qwerty&lt;/ikqpass&gt;
  25. &lt;ikqsalespersonid&gt;144&lt;/ikqsalespersonid&gt;
  26. &lt;ikqcustomerid&gt;4&lt;/ikqcustomerid&gt;
  27. &lt;ikqcustomerno&gt;ABBOTT TOM&lt;/ikqcustomerno&gt;
  28. &lt;ikqmiscchargeid&gt;16&lt;/ikqmiscchargeid&gt;
  29. &lt;ikqmiscchargename&gt;SETUP&lt;/ikqmiscchargename&gt;
  30. &lt;ikqunitcategoryid&gt;11&lt;/ikqunitcategoryid&gt;
  31. &lt;createpackingslips&gt;true&lt;/createpackingslips&gt;
  32. &lt;/row&gt;
  33. &lt;row&gt;
  34. &lt;dealerid&gt;51760&lt;/dealerid&gt;
  35. &lt;locationid&gt;2&lt;/locationid&gt;
  36. &lt;passkey&gt;family2014&lt;/passkey&gt;
  37. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  38. &lt;ikquserid /&gt;
  39. &lt;ikqpass /&gt;
  40. &lt;ikqsalespersonid&gt;-2147483648&lt;/ikqsalespersonid&gt;
  41. &lt;ikqcustomerid&gt;-2147483648&lt;/ikqcustomerid&gt;
  42. &lt;ikqcustomerno /&gt;
  43. &lt;ikqmiscchargeid&gt;-2147483648&lt;/ikqmiscchargeid&gt;
  44. &lt;ikqmiscchargename /&gt;
  45. &lt;ikqunitcategoryid&gt;-2147483648&lt;/ikqunitcategoryid&gt;
  46. &lt;createpackingslips&gt;true&lt;/createpackingslips&gt;
  47. &lt;/row&gt;
  48. &lt;row&gt;
  49. &lt;dealerid&gt;51760&lt;/dealerid&gt;
  50. &lt;locationid&gt;3&lt;/locationid&gt;
  51. &lt;passkey&gt;family2014&lt;/passkey&gt;
  52. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  53. &lt;ikquserid /&gt;
  54. &lt;ikqpass /&gt;
  55. &lt;ikqsalespersonid&gt;-2147483648&lt;/ikqsalespersonid&gt;
  56. &lt;ikqcustomerid&gt;-2147483648&lt;/ikqcustomerid&gt;
  57. &lt;ikqcustomerno /&gt;
  58. &lt;ikqmiscchargeid&gt;-2147483648&lt;/ikqmiscchargeid&gt;
  59. &lt;ikqmiscchargename /&gt;
  60. &lt;ikqunitcategoryid&gt;-2147483648&lt;/ikqunitcategoryid&gt;
  61. &lt;createpackingslips&gt;true&lt;/createpackingslips&gt;
  62. &lt;/row&gt;
  63. &lt;row&gt;
  64. &lt;dealerid&gt;48375&lt;/dealerid&gt;
  65. &lt;locationid&gt;6&lt;/locationid&gt;
  66. &lt;passkey&gt;charterkub1&lt;/passkey&gt;
  67. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  68. &lt;ikquserid /&gt;
  69. &lt;ikqpass /&gt;
  70. &lt;ikqsalespersonid&gt;-2147483648&lt;/ikqsalespersonid&gt;
  71. &lt;ikqcustomerid&gt;-2147483648&lt;/ikqcustomerid&gt;
  72. &lt;ikqcustomerno /&gt;
  73. &lt;ikqmiscchargeid&gt;-2147483648&lt;/ikqmiscchargeid&gt;
  74. &lt;ikqmiscchargename /&gt;
  75. &lt;ikqunitcategoryid&gt;-2147483648&lt;/ikqunitcategoryid&gt;
  76. &lt;createpackingslips&gt;false&lt;/createpackingslips&gt;
  77. &lt;/row&gt;
  78. &lt;row&gt;
  79. &lt;dealerid&gt;51760&lt;/dealerid&gt;
  80. &lt;locationid&gt;8&lt;/locationid&gt;
  81. &lt;passkey&gt;family2014&lt;/passkey&gt;
  82. &lt;enablelocator&gt;false&lt;/enablelocator&gt;
  83. &lt;ikquserid /&gt;
  84. &lt;ikqpass /&gt;
  85. &lt;ikqsalespersonid&gt;-2147483648&lt;/ikqsalespersonid&gt;
  86. &lt;ikqcustomerid&gt;-2147483648&lt;/ikqcustomerid&gt;
  87. &lt;ikqcustomerno /&gt;
  88. &lt;ikqmiscchargeid&gt;-2147483648&lt;/ikqmiscchargeid&gt;
  89. &lt;ikqmiscchargename /&gt;
  90. &lt;ikqunitcategoryid&gt;-2147483648&lt;/ikqunitcategoryid&gt;
  91. &lt;createpackingslips&gt;true&lt;/createpackingslips&gt;
  92. &lt;/row&gt;
  93. &lt;/locationsettings&gt;
  94. &lt;/root&gt;

Here is Model Class

  1. [Serializable, XmlRoot(&quot;locationsettings&quot;)]
  2. public class LocationSettings
  3. {
  4. public LocationSettings()
  5. {
  6. this.RowSettings = new List&lt;RowSettings&gt;();
  7. }
  8. [XmlArrayItem(&quot;row&quot;)]
  9. public List&lt;RowSettings&gt; RowSettings { get; set; }
  10. }
  11. [Serializable, XmlRoot(&quot;row&quot;)]
  12. public class RowSettings
  13. {
  14. [XmlElement(&quot;dealerid&quot;)]
  15. public int dealerid { get; set; }
  16. [XmlElement(&quot;locationid&quot;)]
  17. public int locationid { get; set; }
  18. [XmlElement(&quot;ikquserid&quot;)]
  19. public string? ikquserid { get; set; }
  20. [XmlElement(&quot;ikqpass&quot;)]
  21. public string? ikqpass { get; set; }
  22. }

Here is my code item.Settings contains the above XML in string.

  1. var xmlSettings = $&quot;&lt;?xml version=\&quot;1.0\&quot;?&gt;{item.Settings}&quot;;
  2. var stringReader = new System.IO.StringReader(xmlSettings);
  3. var serializer = new XmlSerializer(typeof(LocationSettings));
  4. var tt = serializer.Deserialize(stringReader) as LocationSettings;

I just need to serialize the XML into LocationSettings Class I do not want to read the other data.

答案1

得分: 1

以下是您要翻译的内容:

以下代码已经测试过。我将[XmlArrayItem]更改为[XmlElement]

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.IO;
  7. using System.Xml;
  8. using System.Xml.Serialization;
  9. namespace ConsoleApplication52
  10. {
  11. class Program
  12. {
  13. const string FILENAME = @"c:\temp\test.xml";
  14. static void Main(string[] args)
  15. {
  16. string xml = File.ReadAllText(FILENAME);
  17. StringReader sReader = new StringReader(xml);
  18. XmlReader xReader = XmlReader.Create(sReader);
  19. xReader.ReadToFollowing("locationsettings");
  20. XmlSerializer serializer = new XmlSerializer(typeof(LocationSettings));
  21. LocationSettings location = (LocationSettings)serializer.Deserialize(xReader);
  22. }
  23. }
  24. [Serializable, XmlRoot("locationsettings")]
  25. public class LocationSettings
  26. {
  27. public LocationSettings()
  28. {
  29. this.RowSettings = new List<RowSettings>();
  30. }
  31. [XmlElement("row")]
  32. public List<RowSettings> RowSettings { get; set; }
  33. }
  34. [Serializable, XmlRoot("row")]
  35. public class RowSettings
  36. {
  37. [XmlElement("dealerid")]
  38. public int dealerid { get; set; }
  39. [XmlElement("locationid")]
  40. public int locationid { get; set; }
  41. [XmlElement("ikquserid")]
  42. public string ikquserid { get; set; }
  43. [XmlElement("ikqpass")]
  44. public string ikqpass { get; set; }
  45. }
  46. }

希望这对您有所帮助。如果您有任何其他问题,请随时提出。

英文:

Following code is tested. I changed [XmlArrayItem] to [XmlElement]

<!-- begin snippet: js hide: false console: true babel: false -->

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.IO;
  7. using System.Xml;
  8. using System.Xml.Serialization;
  9. namespace ConsoleApplication52
  10. {
  11. class Program
  12. {
  13. const string FILENAME = @&quot;c:\temp\test.xml&quot;;
  14. static void Main(string[] args)
  15. {
  16. string xml = File.ReadAllText(FILENAME);
  17. StringReader sReader = new StringReader(xml);
  18. XmlReader xReader = XmlReader.Create(sReader);
  19. xReader.ReadToFollowing(&quot;locationsettings&quot;);
  20. XmlSerializer serializer = new XmlSerializer(typeof(LocationSettings));
  21. LocationSettings location = (LocationSettings)serializer.Deserialize(xReader);
  22. }
  23. }
  24. [Serializable, XmlRoot(&quot;locationsettings&quot;)]
  25. public class LocationSettings
  26. {
  27. public LocationSettings()
  28. {
  29. this.RowSettings = new List&lt;RowSettings&gt;();
  30. }
  31. [XmlElement(&quot;row&quot;)]
  32. public List&lt;RowSettings&gt; RowSettings { get; set; }
  33. }
  34. [Serializable, XmlRoot(&quot;row&quot;)]
  35. public class RowSettings
  36. {
  37. [XmlElement(&quot;dealerid&quot;)]
  38. public int dealerid { get; set; }
  39. [XmlElement(&quot;locationid&quot;)]
  40. public int locationid { get; set; }
  41. [XmlElement(&quot;ikquserid&quot;)]
  42. public string ikquserid { get; set; }
  43. [XmlElement(&quot;ikqpass&quot;)]
  44. public string ikqpass { get; set; }
  45. }
  46. }

<!-- end snippet -->

答案2

得分: 1

LocationSettings模型中的[XmlArrayItem]更改为[XmlElement]即可解决问题。以下代码有效:

  1. var xmlContent = File.ReadAllText("foo.xml");
  2. var xml = XDocument.Parse(xmlContent);
  3. var locationSettingsElement = xml.Root!.Element(nameof(LocationSettings).ToLowerInvariant());
  4. var serializer = new XmlSerializer(typeof(LocationSettings));
  5. var tt = serializer.Deserialize(locationSettingsElement!.CreateReader()) as LocationSettings;

当然,需要处理一些空值检查。

英文:

Changing [XmlArrayItem] to [XmlElement] in LocationSettings model does the trick. Following code works:

  1. var xmlContent = File.ReadAllText(&quot;foo.xml&quot;);
  2. var xml = XDocument.Parse(xmlContent);
  3. var locationSettingsElement = xml.Root!.Element(nameof(LocationSettings).ToLowerInvariant());
  4. var serializer = new XmlSerializer(typeof(LocationSettings));
  5. var tt = serializer.Deserialize(locationSettingsElement!.CreateReader()) as LocationSettings;

Of course there are some null checks to be handled.

huangapple
  • 本文由 发表于 2023年5月25日 00:14:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/76325535.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定