关于税控的一些问题总结

这次做了一个关于socket方式的税控接口,让人伤心的是,他们的接口文档总是不成熟,各种各样的错。

先说说需要注意的地方。

第一:关于socket传送的xml字符串时候应该注意的格式。要不然中文会乱码。

 /// <summary>
        /// 发送XML数据
        /// </summary>
        /// <param name="xml"></param>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <returns>发送XML数据结果</returns>
        public string SocketGetXML(string xml, string ip, string port)
        {
            byte[] result = new byte[1024];
            IPAddress ipAdress = IPAddress.Parse(ip);
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(new IPEndPoint(ipAdress, Convert.ToInt32(port)));
            clientSocket.Send(Encoding.GetEncoding("GB2312").GetBytes(xml));
            Thread.Sleep(1000);
            int receiveLength = clientSocket.Receive(result);
            clientSocket.Close();
            return Encoding.GetEncoding("GB2312").GetString(result, 0, receiveLength);
        }

第二:关于模态化窗口传递中文参数应该注意的问题

在前台js:

var message = window.showModalDialog("InvoiceCharge.aspx?Kpr=" + encodeURI(encodeURI(Kpr)) + "&Je=" + Je + "&InvoVersion=" + InvoVersion + "&InvoNumber=" + fph, "", "dialogHeight:100px;dialogWidth:200px;status:no;center:yes;");

后台C#处理时候:

string Kpr = HttpUtility.UrlDecode(Request["Kpr"]);         

string Je = Request["Je"];         

string InvoVersion = Request["InvoVersion"];    

string InvoNumber = Request["InvoNumber"];

但是如果传递的参数中包含了—号或者%号等一些特别的符号,这时造成无法解析。可以在前台用encodeURIComponent(parameters)转化就行了。

第三:关于模态化窗体的取值:

可以在C#后台,将需要传递的值传递给一个隐藏域,

同时在页面前台用用js获取他的值,但是这个js必须放在body的onload中加载。如:

  <script language="javascript" type="text/javascript">
       function onload() {
           var messsage = document.getElementById("HiddenField2").value;
        window.returnValue = messsage;
            window.close();
        }
    </script>
</head>
<body onload="onload();">

第四:关于js解析xml字符串的问题。

首先要把xml字符串转化为xml对象。然后解析

//字符串转化为xml对象
function toXmlDom(source) {
    var xmlDoc = null;
    if (window.ActiveXObject) {
        var ARR_ACTIVEX = ["MSXML4.DOMDocument", "MSXML3.DOMDocument", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XmlDom"];
        var XmlDomflag = false;
        for (var i = 0; i < ARR_ACTIVEX.length && !XmlDomflag; i++) {
            try {
                var objXML = new ActiveXObject(ARR_ACTIVEX[i]);
                xmlDoc = objXML; XmlDomflag = true;
            } catch (e) { }
        } if (xmlDoc) {
            xmlDoc.async = false;
            xmlDoc.loadXML(source);
        }
    } else {
        var parser = new DOMParser();
        var xmlDoc = parser.parseFromString(source, "text/xml");
    }
    return xmlDoc;
}

这是一个适合各种浏览器的转化方法,兼容了IE和火狐。

然后:

 function getAttributeValue(xmlNode, attrName) {
            if (!xmlNode) return "";
            if (!xmlNode.attributes) return "";
            if (xmlNode.attributes[attrName] != null)
                return xmlNode.attributes[attrName].value;
            if (xmlNode.attributes.getNamedItem(attrName) != null)
                return xmlNode.attributes.getNamedItem(attrName).value; return "";
        }

这是获取相应节点中的属性值。


                          var  xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                            xmlDoc.async = "false";
                            xmlDoc.loadXML(aryBill[i]);
                            var Je = (getAttributeValue(xmlDoc.getElementsByTagName("ITEM")[0].childNodes[55], "VALUE")).split(':')[1].toString();
                            var Kpr = (getAttributeValue(xmlDoc.getElementsByTagName("ITEM")[0].childNodes[70], "VALUE")).split(' ')[0].toString();
                            var fpbbh = InvoVersion;
                            var fph = getAttributeValue(xmlDoc.getElementsByTagName("ITEM")[0].childNodes[95], "VALUE");

这是如何获取其中的值。

原文地址:https://www.cnblogs.com/selfimprove/p/4017769.html