我有一个来自客户端的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>
答案 0 :(得分:19)
答案 1 :(得分:8)
您必须使用XML转义字符:
" to "
' to '
< to <
> to >
& to &
Google以XML格式转义字符以获取更多信息。
答案 2 :(得分:1)
直接回答你的问题:
有没有办法绕过这个而不要求客户端修复文件?
是“不”。您获得的数据不是有效的XML,并且您拒绝它是正确的。我强烈建议回到客户端并说他们必须提供有效的XML,使用David和Rahul提到的字符实体引用。
答案 3 :(得分:1)
要明确地回答您的问题否,您的任何值字段都不能包含<
或>
的XML文件,因为XML格式使用这些字符来表示父元素和子元素,例如<note>
,<to>
,<from>
等
扩展我的答案:当Python脚本使用XML library写<
或>
时,库会将它们分别转换为<
或>
。我不相信这个库是可能的,因为它实际上过滤掉了<
和>
字符以及字符实体引用。这是有道理的 - 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 <value></field1><field2 name="asdfasd">some <other value></field2></doc></root>
。
为它做好准备:
<root>
<doc>
<field1 name="blah">
some <value>
</field1>
<field2 name="asdfasd">
some <other value>
</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字符不需要特殊的编码。