Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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并将@Sign-in XML替换为JSON会话_Xml_Json_Json.net - Fatal编程技术网

NET并将@Sign-in XML替换为JSON会话

NET并将@Sign-in XML替换为JSON会话,xml,json,json.net,Xml,Json,Json.net,JSON.NET框架可以将XML转换为JSON,但它使用JSON中的@符号作为属性。我宁愿在将其发送到视图之前删除它。最好的方法是什么 我知道我可以直接替换,但是@字符可能与某个地方有关,不应该被替换。这个有正则表达式吗 public ActionResult布局() { var xml=新的XmlDocument(); xml.xmlsolver=null; Load(Server.MapPath(“~/App_Data/Navigation.xml”); 返回内容(JsonConvert.S

JSON.NET框架可以将XML转换为JSON,但它使用JSON中的@符号作为属性。我宁愿在将其发送到视图之前删除它。最好的方法是什么

我知道我可以直接替换,但是@字符可能与某个地方有关,不应该被替换。这个有正则表达式吗

public ActionResult布局()
{
var xml=新的XmlDocument();
xml.xmlsolver=null;
Load(Server.MapPath(“~/App_Data/Navigation.xml”);
返回内容(JsonConvert.SerializeXmlNode(xml,Newtonsoft.Json.Formatting.Indented));
}
{
“布局”:{
“导航”:[
{
“@Type”:“菜单”,
“@Title”:“仪表板”
},
{
“@Type”:“菜单”,
“@Route”:“事件”,
“@Title”:“事件”,
“导航”:{
“@Type”:“Action”,
“@Route”:“事件”,
“@Title”:“+添加事件”,
“@Order”:“1”,
“导航”:{
“@Type”:“Item”,
“@Route”:“事件”,
“@Name”:“事件”,
“导航”:[
{
“@Route”:“Pools”,
“@Type”:“次导航”,
“@Name”:“池”
},
{
“@Route”:“括号”,
“@Type”:“次导航”,
“@Name”:“括号”
}
]
}
}
}
]
}
}

我继续使用这个。如果有更好的办法,请告诉我

public ActionResult布局()
{
var xml=新的XmlDocument();
xml.xmlsolver=null;
Load(Server.MapPath(“~/App_Data/Navigation.xml”);
var jsonText=JsonConvert.SerializeXmlNode(xml,Newtonsoft.Json.Formatting.Indented);

返回内容(Regex.Replace(jsonText),(?正则表达式并不总是工作得很好,当内容具有@字符时,首先,它也将被替换。
因此我认为
(?可能更好。

另一种选择是创建您自己的
单向XMLNodeConverter
继承自
JsonConverter
并调用
SerializeObject
,而不是像这样调用
SerializeXmlNode

var json = JsonConvert.SerializeObject(xmlNode, new OneWayXmlNodeConverter());
我之所以称之为“单向”,是因为我假设默认的
XmlNodeConverter
添加了“@”符号,这样它就可以从生成的JSON转换回XML

如果在项目中包含
JSON.NET
源代码(而不仅仅是编译的库),那么创建
OneWayXmlNodeConverter
的简单方法是复制
XmlNodeConverter
代码,删除硬编码的“@登录私有的
GetPropertyName
方法,并将其另存为
OneWayXmlNodeConverter


注意:我知道您的问题是针对“@”符号的“替换”,但此问题的链接变体被标记为重复。

我建议使用以下正则表达式,它与提供的@yieio相同,但增强以保持内容不变,不做任何修改,并且只影响属性名称

var jString = Regex.Replace(
JsonConvert.SerializeXmlNode(content, Newtonsoft.Json.Formatting.None, true),
 "(?<=(\\,\\\"|\\{\\\"))(@)(?!.*\\\":\\\\s )", String.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
var jString=Regex.Replace(
SerializeXmlNode(内容,Newtonsoft.Json.Formatting.None,true),

(?如果由于“@”符号而要访问属性的值,请执行以下操作:

Navigation["@Type"]

这一回应已经有一段时间了,但这仍然可能对某些人有所帮助。 因为您已经有了XMLDocument,所以可以在序列化它之前删除和转换属性

public static void RemoveAllAttributes(XmlDocument xmlDocument)
{
     if (xmlDocument == null || !xmlDocument.HasChildNodes) return;

     foreach (var xmlElement in xmlDocument.SelectNodes(".//*").Cast<XmlElement>().Where(xmlElement => xmlElement.HasAttributes))
     {
          xmlElement.Attributes.RemoveAll();
     }
}

public static void ElementifyAllAttributes(XmlDocument xmlDocument)
{
    if (xmlDocument == null || !xmlDocument.HasChildNodes) return;

    foreach (var xmlElement in xmlDocument.SelectNodes(".//*").Cast<XmlElement>().Where(xmlElement => xmlElement.HasAttributes))
    {
        foreach (XmlAttribute xmlAttribute in xmlElement.Attributes)
        {
            xmlElement.AppendChild(xmlDocument.CreateElement(xmlAttribute.Name)).InnerText = xmlAttribute.Value;
        }

        xmlElement.Attributes.RemoveAll();
     }
}

如果JSON缩进,这可能会起作用:

Regex.Replace(result, @"(\s*)""@(.*)"":", @"$1""$2"":", RegexOptions.IgnoreCase);

我花了很长时间才找到正确的答案,所以我想与大家分享一下:

var xDocument=xDocument.Parse(“c”); var builder=新的StringBuilder(); JsonSerializer.Create().Serialize(新的CustomJsonWriter(新的StringWriter(builder)),xDocument); var serialized=builder.ToString(); 公共类CustomJsonWriter:JsonTextWriter { 公共CustomJsonWriter(TextWriter编写器):基本(编写器){} 公共重写无效WritePropertyName(字符串名称) { if(name.StartsWith(“@”)| name.StartsWith(“#”) { base.WritePropertyName(name.Substring(1)); } 其他的 { base.WritePropertyName(名称); } } }
输出:

{“xml”:{“a”:{“attr”:“b”,“text”:“c”}
首先将xml内容中的所有“@”替换为某个占位符(例如{{at the_rate}})

JsonConvert.SerializeXmlNode(doc).Replace("@", "").Replace("{{at_the_rate}}", "@")

这是我的正则表达式贡献,使用lookaheads和lookbehinds确保它只出现在属性字段中


(?m)(?如果您知道这是@signs在json中显示的唯一位置,string.replace的工作速度更快或更大,正如@yieio所提到的,这对于以
@
开头的值仍然不起作用,例如,
将导致
{“test”:{“attr”:“foo”}
。这对性能不好。最好创建一个自定义JsonTextWriter,如此处其他地方所述。这对于以
开头的值仍然不起作用。”@
,例如,
@Aristoteles检查我的正则表达式,它基于上述内容,但不修改内容正则表达式方法对性能不好,并且可能存在错误。您的建议很有趣,但您尝试过吗?当我尝试复制XmlNodeConverter代码时,我发现它严重依赖于内部接口和类,因此我没能按照你的建议去做。你成功地让它工作了吗?@polaeward我在我的项目中包含了Json.Net源代码,所以我能够使用内部代码。我会更新我的答案,因为你是对的,如果你只是使用库,就不那么容易了:-)太好了,总是建议更新答案:)事实上,我最终意识到我必须嵌入newtonsoft代码才能编辑它,坚持使用特定版本并丢失作者未来的所有更新,或者使用regex,我决定使用regex当我尝试使用它时,它没有
JsonConvert.SerializeXmlNode(doc).Replace("@", "").Replace("{{at_the_rate}}", "@")