【问题标题】:LINQ to XML XElement NodeLINQ to XML XElement 节点
【发布时间】:2011-01-27 18:09:04
【问题描述】:

我正在使用 LinqXML 创建一个 XML 文件。

string value = "Steet,<BR> </BR> City";
XElement address = new XElement("Address", value);

一旦我写了xml文件,地址值显示为Steet,&amp;lt;BR&amp;gt &amp;lt;/BR&amp;gt 我只需要它就像原始的一样。 (即使它没有很好地形成)

【问题讨论】:

    标签: c# xml xsd linq-to-xml xmlserializer


    【解决方案1】:

    好吧,如果这些东西格式不正确,那么不要指望能够将其视为 XML。因此,如果您想将格式不正确的 HTML 标记放入 XML 元素中,请考虑使用 CDATA 部分,例如

        string value = "Steet,<BR> </BR> City";
        XElement address = new XElement("Address", new XCData(value));
    

    这将导致

    <Address><![CDATA[Steet,<BR> </BR> City]]></Address>
    

    如果您想将值解析为 XML,请使用片段模式下的 XmlReader 进行解析,例如

    static void Main()
    {
        string value = "Steet,<BR> </BR> City";
        XElement address = new XElement("Address", ParseFragment(value));
        Console.WriteLine(address);
    }
    
    static IEnumerable<XNode> ParseFragment(string fragment)
    {
        using (StringReader sr = new StringReader(fragment))
        {
            using (XmlReader xr = XmlReader.Create(sr, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment }))
            {
                xr.Read();
                XNode node;
                while (!xr.EOF && (node = XNode.ReadFrom(xr)) != null)
                {
                    yield return node;
                }
            }
        }
    }
    

    结果

    <Address>Steet,<BR> </BR> City</Address>
    

    【讨论】:

    • 谢谢马丁。由于我是新投票,因此我只能增加 1。再次感谢您的示例。
    • 这实际上在功能上与原始版本相同。使用&amp;lt; 或使用CDATA 转义&amp;lt; 并不重要。无论哪种方式,当您使用 XML 解析器读取 &lt;Address&gt; 节点的值时,您都会得到一个包含文字尖括号的字符串。
    • 嗨乔尔,感谢您的回复。此 XML 将用于生成 PDF 文件。所以 PDF 创建人期待标签,以便可以使用该工具进行映射。例如(
      => PDF 换行符)
    • 尽管如此,在这种情况下,CDATA 仍然执行与 &amp;lt; 完全相同的操作。如果您希望 &lt;BR /&gt; 标记实际上是 XML 文档的一部分,请参阅我的答案的编辑。
    【解决方案2】:

    我认为您不需要更改任何内容。 &amp;lt;&amp;gt; 是尖括号在 XML 中的转义方式。 XML 解析器在读取字符串值时自动将它们转换回文字尖括号。 CDATA 只是转义尖括号的另一种方式。在这种情况下,它们都完成了完全相同的事情。如果您使用原始代码并使用 XML 解析器读取 &lt;Address&gt; 节点的值,则返回的字符串将为 Street,&lt;BR&gt; &lt;/BR&gt; City。更改转义为 CDATA 的方法实际上并没有改变任何东西,只是使您的 XML(可以说)更难阅读。

    如果您希望&lt;BR /&gt; 标记实际上是XML 文档的一部分,那么您应该将它作为文档的一部分。也就是说……

    new XElement("Address", "Street,", new XElement("BR"), " City")
    

    【讨论】:

      【解决方案3】:

      您需要将其包装在 CDATA 中以保留它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多