Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在JsonConvert期间剥离名称空间和xml版本_.net_Vb.net - Fatal编程技术网

.net 如何在JsonConvert期间剥离名称空间和xml版本

.net 如何在JsonConvert期间剥离名称空间和xml版本,.net,vb.net,.net,Vb.net,有没有办法通过JsonConvert或任何其他函数返回一个干净的Json对象,而不使用XML和名称空间?我有一个从远程Soap服务获取数据的Webercice,我给用户选择以XML或Json获取数据。我得到的XML如下所示 <?xml version="1.0"?> <ATT_ADDR_VAL_RESP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/

有没有办法通过JsonConvert或任何其他函数返回一个干净的Json对象,而不使用XML和名称空间?我有一个从远程Soap服务获取数据的Webercice,我给用户选择以XML或Json获取数据。我得到的XML如下所示

<?xml version="1.0"?>
<ATT_ADDR_VAL_RESP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ADDR_VAL_RESP xmlns="http://lsr.att.com/obf/tML/UOM">
        <HDR>
            <MESSAGE_ID>FROMCLIENTAPPLET</MESSAGE_ID>
            <MSG_TIMESTAMP>2020-03-11T16:24:07</MSG_TIMESTAMP>
            <TXNUM>temP</TXNUM>
            <DTSENT>202003110424PM</DTSENT>
        </HDR>
        <RESP_STATUS_GRP>
            <RESPC>003</RESPC>
            <RESPD>Address Match Found</RESPD>
        </RESP_STATUS_GRP>
        <ATT_ADDR_INFO>
            <FEP>X</FEP>
            <SVC_ADDR_GRP>
                <SANO>818</SANO>
                <SASD>W</SASD>
                <SASN>7TH</SASN>
                <TAR>001</TAR>
            </SVC_ADDR_GRP>
        </ATT_ADDR_INFO>
    </ADDR_VAL_RESP>
</ATT_ADDR_VAL_RESP>
{
    "?xml": {
        "@version": "1.0"
    },
    "ATT_ADDR_VAL_RESP": {
        "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
        "@xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
        "ADDR_VAL_RESP": {
            "@xmlns": "http://lsr.att.com/obf/tML/UOM",
            "HDR": {
                "MESSAGE_ID": "FROMCLIENTAPPLET",
                "MSG_TIMESTAMP": "2020-03-11T16:28:50",
                "TXNUM": "temP",
                "DTSENT": "202003110428PM"
            },
但我希望它看起来像这样

 {
       "ATT_ADDR_VAL_RESP": {
            "ADDR_VAL_RESP": {
                "HDR": {
                    "MESSAGE_ID": "FROMCLIENTAPPLET",
                    "MSG_TIMESTAMP": "2020-03-11T16:28:50",
                    "TXNUM": "temP",
                    "DTSENT": "202003110428PM"
                }, .....

所以问题是,有没有其他方法可以做到这一点,然后将xml响应作为一个部分,删除任何额外的内容,如名称空间等,并创建一个新对象,以返回json编码的对象。

源xml文件或字符串可以用许多不同的方式进行解析。我之所以选择这个类,是因为它使用简单,并且与JSON序列化程序直接兼容

XML有两个元素:
-定义XML版本(但不是编码:假定为UTF-8)的序言
-一个根元素(
ATT_ADDR_VAL_RESP
),其中包含在XML转换为JSON格式时需要删除的属性

或方法可用于生成XML文档对象。
-前者需要一个表示文件(或Xml/文本读取器)路径的流或字符串
-后者只解析XML字符串

假设它是一个流,我们可以使用它的
Load()
方法生成XmlDocument:

Dim doc = New XmlDocument()
doc.Load([XML Stream])  
' or doc.Load([XML File Path])
' or doc.LoadXml([XML String])
要删除prolog元素,我们可以删除XmlDocument的第一个子节点:

doc.RemoveChild(doc.FirstChild)
由于根元素(
ATT_ADDR_VAL_RESP
)需要保留(如示例结果中所示),而其属性应该删除,因此我们可以使用集合的方法执行清理:

doc.FirstChild.Attributes.RemoveAll()
如果根元素不是必需的,我们还可以使用重载来指定是否应保留根元素:

Dim json = JsonConvert.SerializeXmlNode(doc, Formatting.Indented, True)
最后一个参数指定应忽略根元素

根元素的第一个子节点还包含需要删除的参数:

For Each childNode As XmlNode in doc.FirstChild.ChildNodes
    childNode.Attributes.RemoveAll()
Next
所有部分组合在一起,用于将XML序列化为JSON字符串:

Dim doc = New XmlDocument()
doc.Load([XML Stream])  

' FirstChild is the prolog element
doc.RemoveChild(doc.FirstChild)

' Now FirstChild is the XML Root element
doc.FirstChild.Attributes.RemoveAll()

For Each childNode As XmlNode in doc.FirstChild.ChildNodes
    childNode.Attributes.RemoveAll()
Next

' Or RemoveAllAttributes(doc)

Dim json = JsonConvert.SerializeXmlNode(doc, Formatting.Indented)
如果需要剥离所有子节点的属性,可以使用递归方法代替循环:

RemoveAllAttributes(doc)
(...)

Private Sub RemoveAllAttributes(XmlNode node)
    if node.Attributes IsNot Nothing Then node.Attributes.RemoveAll()
    For Each childNode As XmlNode In node.ChildNodes
        If childNode.Attributes IsNot Nothing Then childNode.Attributes.RemoveAll()
        If childNode.HasChildNodes Then
            RemoveAllAttributes(childNode)
        End if
    Next
End Sub

用XmlDocument加载XML,
dim doc=new XmlDocument()doc.Load([XML])
,然后删除第一个节点:
doc.RemoveChild(doc.ChildNodes(0))
dim json=JsonConvert.serializedXmlNode(doc,Newtonsoft.json.Formatting.Indented)
。如果这是您的意思。如果不将JSON反序列化为类结构,您可以添加
doc.FirstChild.Attributes.RemoveAll()
。或者
在doc.FirstChild.ChildNodes ChildNodes childNode.Attributes.RemoveAll()中将每个childNode作为XmlNode删除下一步
从子XmlNodes中删除其他属性(如果需要更深入的话,请添加递归)。我更关心的是删除名称空间,如“@xmlns:xsi”:“是的,这样做了。”。。你想把它作为答案贴出来,这样我就可以接受你的答案了