XElement.Value正在从内容中剥离XML标记

时间:2015-06-22 16:40:25

标签: c# .net xml xml-parsing xelement

我有以下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>

2 个答案:

答案 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);

认为应该做你想做的事情,虽然如问题评论中所述,它非常可怕。