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.ValueserializedContent是这样的:

{  
    "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,它会给您预期的结果。