XElement.Value 正在从内容中删除 XML 标签
XElement.Value is stripping XML tags from content
我有以下 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);
}
}
来自xSerializedContent.Value
的serializedContent
是这样的:
{
"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\"}"
}
正如我们所见,<SerializedContent>
是一个 JSON,在 JSON 里面,我在 EntitiesChanges
里面还有另一个 XML。 如何避免 XML 标签从 <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\"}"
}
您正在使用 Value
属性,它被记录为 return 元素中串联的 text 后代节点。
所以听起来您想要连接所有子节点的字符串表示形式。所以你可以使用:
var serializedContent = string.Join("", xSerializedContent.Nodes);
我 认为 应该做你想做的,尽管如问题评论中所述,这非常可怕。
正如其他人所说,这种格式真的很糟糕,一旦 JSON 中嵌入的 XML 包含双引号(因为在 JSON 中它们将被编码为 \"
,这将使 XML 无效)。 JSON 确实应该作为 CDATA 嵌入。
现在,假设您无法控制格式,您需要读取 <SerializedContent>
元素的 "inner XML"。没有开箱即用的支持,但您可以轻松创建一个扩展方法来实现它:
static class XmlExtensions
{
public static string GetInnerXml(this XNode node)
{
using (var reader = node.CreateReader())
{
reader.MoveToContent();
return reader.ReadInnerXml();
}
}
}
现在您可以使用 .GetInnerXml()
代替 .Value
,它会给您预期的结果。
我有以下 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);
}
}
来自xSerializedContent.Value
的serializedContent
是这样的:
{
"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\"}"
}
正如我们所见,<SerializedContent>
是一个 JSON,在 JSON 里面,我在 EntitiesChanges
里面还有另一个 XML。 如何避免 XML 标签从 <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\"}"
}
您正在使用 Value
属性,它被记录为 return 元素中串联的 text 后代节点。
所以听起来您想要连接所有子节点的字符串表示形式。所以你可以使用:
var serializedContent = string.Join("", xSerializedContent.Nodes);
我 认为 应该做你想做的,尽管如问题评论中所述,这非常可怕。
正如其他人所说,这种格式真的很糟糕,一旦 JSON 中嵌入的 XML 包含双引号(因为在 JSON 中它们将被编码为 \"
,这将使 XML 无效)。 JSON 确实应该作为 CDATA 嵌入。
现在,假设您无法控制格式,您需要读取 <SerializedContent>
元素的 "inner XML"。没有开箱即用的支持,但您可以轻松创建一个扩展方法来实现它:
static class XmlExtensions
{
public static string GetInnerXml(this XNode node)
{
using (var reader = node.CreateReader())
{
reader.MoveToContent();
return reader.ReadInnerXml();
}
}
}
现在您可以使用 .GetInnerXml()
代替 .Value
,它会给您预期的结果。