有没有办法在XML文件中包含大于或小于标志?

时间:2015-04-01 19:13:41

标签: xml

我有一个来自客户端的XML文件,其中包含大于>且小于<个符号,并且无法进行XML格式检查。 有没有办法绕过这个而不要求客户端修复文件?

e.g。

<?xml version="1.0" encoding="UTF-8"?>

<note Name="PrintPgmInfo <> VDD">
 <to>Tove</to>
 <from>Jani</from>
 <heading>Reminder</heading>
 <body>Don't forget me this weekend!</body>
</note>

5 个答案:

答案 0 :(得分:19)

您可以尝试使用它:

< = &lt;

> = &gt;

这些被称为Character Entity References

答案 1 :(得分:8)

您必须使用XML转义字符:

" to  &quot;
' to  &apos;
< to  &lt;
> to  &gt;
& to  &amp;

Google以XML格式转义字符以获取更多信息。

答案 2 :(得分:1)

直接回答你的问题:

  

有没有办法绕过这个而不要求客户端修复文件?

是“不”。您获得的数据不是有效的XML,并且您拒绝它是正确的。我强烈建议回到客户端并说他们必须提供有效的XML,使用David和Rahul提到的字符实体引用。

答案 3 :(得分:1)

要明确地回答您的问题,您的任何值字段都不能包含<>的XML文件,因为XML格式使用这些字符来表示父元素和子元素,例如<note><to><from>

扩展我的答案:当Python脚本使用XML library<>时,库会将它们分别转换为&lt&gt 。我不相信这个库是可能的,因为它实际上过滤掉了<>字符以及字符实体引用。这是有道理的 - XML库阻止您破坏用于父xml.etree.cElementTree.Element或任何子xml.etree.cElementTree.SubElement对象字段的语法。例如,使用此great answer中的代码块进行实验:

import xml.etree.cElementTree as ET

root = ET.Element("root")
doc = ET.SubElement(root, "doc")

ET.SubElement(doc, "field1", name="blah").text = "some <value>"
ET.SubElement(doc, "field2", name="asdfasd").text = "some <other value>"

tree = ET.ElementTree(root)
tree.write("filename.xml")

这会产生<root><doc><field1 name="blah">some &lt;value&gt;</field1><field2 name="asdfasd">some &lt;other value&gt;</field2></doc></root>

为它做好准备:

<root>
    <doc>
        <field1 name="blah">
            some &lt;value&gt;
        </field1>
        <field2 name="asdfasd">
            some &lt;other value&gt;
        </field2>
    </doc>
</root>

但是,没有什么可以阻止您手动添加这些字符:读入XML文件并重新编写,添加文本,即使它包含<>。如果你想要一个合适的XML文件,只需确保这些字符只在注释字段中使用。

对于您的特定问题,您可以从客户端的XML文件中读取行,然后删除<>字符,或者,如果客户端需要它们,将它们移动到该行的注释部分。部分挑战是你必须留在文件的<note>,等部分......这很有挑战性但是有可能!

以下是我期望的结果。

<?xml version="1.0" encoding="UTF-8"?>

<note Name="PrintPgmInfo VDD"> <!-- PrintPgmInfo <> VDD -->
 <to>Tove</to>
 <from>Jani</from>
 <heading>Reminder</heading>
 <body>Don't forget me this weekend!</body>
</note>

答案 4 :(得分:0)

您可以使用类似的全角小于(U + FF1C)和全角大于(0xFF1E)标志:<>

这些Unicode字符不需要特殊的编码。