我在C#中的背景。与C#相比,我在检索JAVA中的属性计数时面临行为差异。
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book xmlns:v="urn:schemas-microsoft-com:vml" style="width:149.65pt"
xmlns:w="urn:schemas-microsoft-com:office:office">
<v:object w:dxaOrig="1440" w:dyaOrig="1440">
</v:object>
</book>
在C#中,'Xmlns'标签被视为属性,因此在检索属性计数时,上述Xml元素'book'的值为3。而在JAVA中(根据我的不足,如果错误则纠正我)'Xmlns'不是属性,它用作名称空间声明,它也被视为保留XML伪属性来声明命名空间。因此,上述案例的属性计数在JAVA中将为1。我可以将'xmlns'标记检索为名称空间计数,即2。
C#代码:
for(int i=0;i<reader.AttributeCount;i++)
{
//Here the attribute count is 3
}
Java代码:
for (int i = 0; i < reader.getAttributeCount(); i++) {
//Here the attribute count is 1 }
我已经为“XmlReader”包含了一个包装类来处理C#中的属性。请参考我用于检索属性计数的包装器方法以满足c#行为。
爪哇:
public int getAttributeCount()
{
if (_reader.getEventType() == XMLStreamConstants.START_ELEMENT
|| _reader.getEventType() == XMLStreamConstants.ATTRIBUTE) {
int i = 0;
i = _reader.getAttributeCount();
if (_reader.getNamespaceCount() > 0) {
i += _reader.getNamespaceCount();
}
return i; //now the count will be 3.
} else {
return 0;
}
}
我担心的是我想知道如何在C#中按顺序读取元素“book”属性。由于'xmlns'标记被视为命名空间,因此只能分别处理命名空间和属性,并且在迭代属性计数时很难知道哪个是第一个。请告诉我你的建议吗?
答案 0 :(得分:0)
xmlns是XML中的保留前缀/名称。 如下所述:http://www.w3.org/TR/xml-names/#xmlReserved
如果您需要在解析中包含那些,请尝试处理类型
XmlStreamConstants.NAMESPACE
以及
答案 1 :(得分:0)
你不能要求“将名称空间声明视为Java中的属性”,因为Java提供了许多用于处理XML的库和模型,它们都是不同的。
在DOM(包括Java和C#在许多平台上以稍微不同的形式提供)中,名称空间声明被视为属性。但是DOM是古老的并且早于名称空间,并且有许多现代API用于在Java中处理XML。您的示例使用StAX;还有SAX,JDOM2,XOM等。在大多数现代模型中,名称空间和属性被视为单独的东西,因此计数属性将不包括名称空间声明。