我有以下XML:
<Message>
<Identification>c387e36a-0d79-405a-745c-7fc3e1aa8160</Identification>
<SerializedContent>
{"Identification":"81d090ca-b913-4f15-854d-059055cc49ff","LogType":0,"LogContent":"{\"EntitiesChanges\":\"
<audit>
<username>acfc</username>
<date>2015-06-04T15:15:34.7979485-03:00</date>
<entities>
<entity>
<properties>
<property>
<name>DepId</name>
<current>2</current>
</property>
<property>
<name>FirstName</name>
<current>camila</current>
</property>
</properties>
</entity>
</entities>
</audit>\",\"FeatureName\":\"Adicionar Cliente\",\"Operations\":0,\"MachineNameOrigin\":\"VERDE\"}"}
</SerializedContent>
</Message>
和这段代码:
[HttpPost]
[ActionName("Message")]
public HttpResponseMessage MessageListener()
{
var requestString = Request.Content.ReadAsStringAsync().Result;
try
{
var xdoc = XDocument.Parse(requestString);
var xSerializedContent = xdoc.Root.Element("SerializedContent");
var serializedContent = xSerializedContent.Value;
}
catch (XmlException e)
{
return CreateHttpResponseMessage("Invalid XML. " + e.Message);
}
catch (Exception e)
{
return CreateHttpResponseMessage(e.Message);
}
}
来自serializedContent
的{{1}}就是:
xSerializedContent.Value
我们可以看到{
"Identification":"81d090ca-b913-4f15-854d-059055cc49ff",
"LogType":0,
"LogContent":"{\"EntitiesChanges\":\"acfc2015-06-04T15:15:34.7979485-03:00DepId2FirstNamecamila\",\"FeatureName\":\"Adicionar Cliente\",\"Operations\":0,\"MachineNameOrigin\":\"VERDE\"}"
}
是一个JSON,在JSON中我在<SerializedContent>
内有另一个XML。 如何避免 EntitiesChanges
中的XML标记移植?
预期结果:
<SerializedContent>
答案 0 :(得分:2)
正如其他人所说,这种格式真的很糟糕,一旦嵌入JSON中的XML包含双引号就会中断(因为在JSON中它们将被编码为\"
,这将使XML无效)。 JSON应该真的作为CDATA嵌入。
现在,假设您无法控制格式,则需要阅读<SerializedContent>
元素的“内部XML”。开箱即用不支持这种功能,但您可以轻松创建一个扩展方法:
static class XmlExtensions
{
public static string GetInnerXml(this XNode node)
{
using (var reader = node.CreateReader())
{
reader.MoveToContent();
return reader.ReadInnerXml();
}
}
}
现在您可以使用.GetInnerXml()
代替.Value
,它会为您提供预期的结果。
答案 1 :(得分:1)
您正在使用Value
属性,该属性已记录为返回元素中连接的 text 后代节点。
所以听起来你想要所有子节点的字符串表示的串联。所以你可以使用:
var serializedContent = string.Join("", xSerializedContent.Nodes);
我认为应该做你想做的事情,虽然如问题评论中所述,它非常可怕。