在C#中反序列化分类帐导出请求中的XML响应时,我收到了以下错误.

错误"XmlException:‘’,十六进制值0x04,是无效字符." 这是由于父元素中主元素前面的(&#4)字符.

<LEDGER>
 <NAME>Profit &amp; Loss A/c</NAME>
 <PARENT>&#4; Primary</PARENT>
 <OPENINGBALANCE>1000.00</OPENINGBALANCE>
 <CLOSINGBALANCE>2000.00</CLOSINGBALANCE>
</LEDGER>

谁知道,要么在回应中摆脱这个角色,要么在反序列化时忽略这个角色?

谢谢.

C#代码

[XmlRoot(ElementName = "LEDGER")]
public class Ledger
{
    [XmlElement(ElementName = "NAME")]
    public string Name { get; set; } = string.Empty;
    [XmlElement(ElementName = "PARENT")]
    public string Parent { get; set; } = string.Empty;
    [XmlElement(ElementName = "OPENINGBALANCE")]
    public string OpeningBalance { get; set; } = string.Empty;
    [XmlElement(ElementName = "CLOSINGBALANCE")]
    public string ClosingBalance { get; set; } = string.Empty;
}
[XmlRoot(ElementName = "LEDGERS")]
public class Ledgers
{
    [XmlElement(ElementName = "LEDGER")]
    public List<Ledger> Ledgers { get; set; } = new List<Ledger>();
}
var content = new StringContent("<ENVELOPE><HEADER><VERSION>1</VERSION><TALLYREQUEST>EXPORT</TALLYREQUEST><TYPE>DATA</TYPE><ID>CA_LEDGER</ID></HEADER><BODY><DESC><STATICVARIABLES><SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVCURRENTCOMPANY>Demo-Company</SVCURRENTCOMPANY></STATICVARIABLES><TDL><TDLMESSAGE><REPORT ISMODIFY=\"NO\" ISFIXED=\"NO\" ISINITIALIZE=\"NO\" ISOPTION=\"NO\"ISINTERNAL=\"NO\" NAME=\"CA_LEDGER\"><FORM>CA_LEDGER</FORM></REPORT><FORM ISMODIFY=\"NO\" ISFIXED=\"NO\" ISINITIALIZE=\"NO\" ISOPTION=\"NO\" ISINTERNAL=\"NO\"NAME=\"CA_LEDGER\"><PART>CA_LEDGER</PART><XMLTAG>LEDGERS</XMLTAG></FORM><PART ISMODIFY=\"NO\" ISFIXED=\"NO\" ISINITIALIZE=\"NO\" ISOPTION=\"NO\" ISINTERNAL=\"NO\"NAME=\"CA_LEDGER\"><LINE>CA_LEDGER</LINE><REPEAT>CA_LEDGER:CA_LEDGERCOLLECTION</REPEAT><SCROLLED>Vertical</SCROLLED></PART><LINE ISMODIFY=\"NO\" ISFIXED=\"NO\" ISINITIALIZE=\"NO\" ISOPTION=\"NO\" ISINTERNAL=\"NO\"NAME=\"CA_LEDGER\"><FIELDS>CA_NAME,CA_PARENT,CA_OPENINGBALANCE,CA_CLOSINGBALANCE</FIELDS><XMLTAG>LEDGER</XMLTAG></LINE><FIELD ISMODIFY=\"NO\" ISFIXED=\"NO\" ISINITIALIZE=\"NO\" ISOPTION=\"NO\"ISINTERNAL=\"NO\" NAME=\"CA_NAME\"><SET>$NAME</SET><XMLTAG>NAME</XMLTAG></FIELD><FIELD ISMODIFY=\"NO\" ISFIXED=\"NO\" ISINITIALIZE=\"NO\" ISOPTION=\"NO\"ISINTERNAL=\"NO\" NAME=\"CA_PARENT\"><SET>$PARENT</SET><XMLTAG>PARENT</XMLTAG></FIELD><FIELD ISMODIFY=\"NO\" ISFIXED=\"NO\" ISINITIALIZE=\"NO\" ISOPTION=\"NO\"ISINTERNAL=\"NO\" NAME=\"CA_OPENINGBALANCE\"><TYPE>Amount</TYPE><SET>$OPENINGBALANCE</SET><XMLTAG>OPENINGBALANCE</XMLTAG></FIELD><FIELD ISMODIFY=\"NO\" ISFIXED=\"NO\" ISINITIALIZE=\"NO\" ISOPTION=\"NO\"ISINTERNAL=\"NO\" NAME=\"CA_CLOSINGBALANCE\"><TYPE>Amount</TYPE><SET>$CLOSINGBALANCE</SET><XMLTAG>CLOSINGBALANCE</XMLTAG></FIELD><COLLECTION ISMODIFY=\"NO\" ISFIXED=\"NO\" ISINITIALIZE=\"NO\" ISOPTION=\"NO\"ISINTERNAL=\"NO\" NAME=\"CA_LEDGERCOLLECTION\"><TYPE>Ledger</TYPE><NATIVEMETHOD>Name</NATIVEMETHOD><NATIVEMETHOD>Parent</NATIVEMETHOD><NATIVEMETHOD>OpeningBalance</NATIVEMETHOD><NATIVEMETHOD>ClosingBalance</NATIVEMETHOD></COLLECTION></TDLMESSAGE></TDL></DESC></BODY></ENVELOPE>", null, "application/xml");
var response = await new HttpClient().PostAsync(URL, content); // Url is http://localhost:1000
if (!response.IsSuccessStatusCode)
{
    return Enumerable.Empty<Ledger>();
}
XmlSerializer serializer = new XmlSerializer(typeof(Ledgers));
var ledgers = (Ledgers?)serializer.Deserialize(await response.Content.ReadAsStreamAsync());

推荐答案

你不可能将其限制在理货范围内.

但你可以只做var xml = xml .Replace("&#4; ", "")

因为您使用的是C#,所以您可以使用由我创建的TallyConnector库,它是开源的,可以作为nugget使用

要使用TallyConnector获取分类帐,只需调用

    var TC = new TallyService();
    List<Ledger> Ledgers = await TC .GetLedgersAsync();

所有这些常见的问题,如更换‘&;#4’,也都由图书馆处理.

Csharp相关问答推荐

System.Text.Json:反序列化返回为空数组的字典时出错

循环访问Android视图中动态创建的子视图

如何使用FastEndpoints和.NET 8 WebAppliationBuilder进行集成测试?

使用GeneratedComInterfaceProperty的.NET 8 COM类对于VB 6/SYS或ALEViewer不可见

更改对象的旋转方向

在. net毛伊岛窗口的深度链接已经创建""

WPF Windows初始化正在锁定. Net 8中分离的线程

无法解析数据库上下文的服务

如何在C#中将对象[*,*]直接转换为字符串[*,*]?

Int和uint相乘得到LONG?

为具有实体框架后端的Reaction项目 Select 正确的Visual Studio模板

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

将操作从编辑页重定向到带参数的索引页

有条件地定义预处理器指令常量

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

在使用AWS SDK for.NET时,如何判断S3是否已验证我的对象的校验和?

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

为什么我可以在注册表编辑器中更改值,但不能在以管理员身份运行的C#表单应用程序中更改?

.NET EF Core Automapper项目到筛选不起作用

.NET6最小API:操作.MapGet之后的响应