我意识到它并不优雅或不合适,但它是否允许(在格式良好的XML中)XML元素中的属性值跨越多行?
例如
<some-xml-element value="this value goes over....
multiple lines!" />
Run Code Online (Sandbox Code Playgroud)
是的,我意识到有更好的写作方式.我个人会写它:
<some-xml-element>
<value>this value goes over...
multiple lines!</value>
</some-xml-element>
Run Code Online (Sandbox Code Playgroud)
要么:
<some-xml-element value="this value goes over.... " />
Run Code Online (Sandbox Code Playgroud)
但是我们有自己的XML解析器,我想知道第一个例子是否在格式良好的XML中被允许.
当我尝试将HTML文本或CDATA放入我的XML属性中时,我的解析器一直得到"XML解析器失败:未终止的属性".有没有办法做到这一点,还是标准不允许这样做?
免责声明:以下是针对XML的罪行.这就是我试图用XSLT改变它的原因:)
我的XML目前看起来像这样:
<root>
<object name="blarg" property1="shablarg" property2="werg".../>
<object name="yetanotherobject" .../>
</root>
Run Code Online (Sandbox Code Playgroud)
是的,我将所有文本数据放在属性中.我希望XSLT能救我; 我想走向这样的事情:
<root>
<object>
<name>blarg</name>
<property1>shablarg</name>
...
</object>
<object>
...
</object>
</root>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我实际上已经完成了所有这些工作,除了我对XML的罪恶更加特殊.一些标签看起来像这样:
<object description = "This is the first line
This is the third line. That second line full of whitespace is meaningful"/>
Run Code Online (Sandbox Code Playgroud)
我在linux下使用xsltproc,但它似乎没有任何保留空格的选项.我试图使用xsl:preserve-space和xml:space ="preserve"无济于事.我发现的每个选项似乎都适用于在元素本身内保留空格,而不是属性.每一次,以上都改为:
This is the first line This is the third line. That second line full of whitespace is meaningful
所以问题是,我可以保留属性空白吗?
使用 javax.xml.XMLStreamWriter 时,有什么方法可以保留属性中的空格吗?我知道 XMLStreamReader 将执行Attribute-Value Normalization,将\r\n\tXML 转换为空格,因此编写者需要发出实体引用(例如 )以保留空格。有什么方法可以告诉作者对空白使用实体引用吗?我可以自己添加对属性的实体引用吗?
以下 JUnit3 测试通过。当我编码时"Hello,\r\n\tworld",我想得到同样的东西。但相反,解码后的值为"Hello world"(两个空格)。
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.stream.*;
import junit.framework.TestCase;
public class XmlStreamTest extends TestCase {
public void testAttribute() throws XMLStreamException {
StringWriter stringWriter = new StringWriter();
XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newFactory().createXMLStreamWriter(stringWriter);
xmlStreamWriter.writeStartDocument();
xmlStreamWriter.writeStartElement("root");
xmlStreamWriter.writeAttribute("a", "Hello,\r\n\tWorld! ");
xmlStreamWriter.writeEndElement();
xmlStreamWriter.writeEndDocument();
xmlStreamWriter.close();
assertEquals("<?xml version=\"1.0\" ?><root a=\"Hello,\r\n\tWorld! \"></root>", stringWriter.toString());
StringReader stringReader = new StringReader(stringWriter.toString());
XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(stringReader);
assertEquals(XMLStreamConstants.START_DOCUMENT, xmlStreamReader.getEventType());
assertEquals(XMLStreamConstants.START_ELEMENT, xmlStreamReader.next());
// This is …Run Code Online (Sandbox Code Playgroud) 我需要在我正在加载的XML文件中的字符串中指示"新行".
如果我硬编码字符串:
myTextView.text = [NSString stringWithString:@"Line1 \nLine2 \nLine3"];
Run Code Online (Sandbox Code Playgroud)
它显示:
Line1
Line2
Line3
Run Code Online (Sandbox Code Playgroud)
(如预期的那样)
但是,如果我将确切的字符串放在我的XML文件中:
<someNode string="Line1 \nLine2 \nLine3" />
Run Code Online (Sandbox Code Playgroud)
然后将其加载到它显示的UITableView中:
Line1 \nLine2 \nLine3
Run Code Online (Sandbox Code Playgroud)
我在某处读过'\n'字符是在编译时处理的,这是真的吗?这可以解释我所看到的行为.
如果是这种情况,我怎么能在我的XML加载字符串中定义一个新行,并仍然在UITextView中正确处理它?还有另一种方法吗?
谢谢.
xml ×6
html ×1
iphone ×1
java ×1
newline ×1
objective-c ×1
uitextview ×1
whitespace ×1
xml-parsing ×1
xslt ×1