如何使用Java读取XML属性?

时间:2017-11-16 05:45:19

标签: java xml

我在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'标记被视为命名空间,因此只能分别处理命名空间和属性,并且在迭代属性计数时很难知道哪个是第一个。请告诉我你的建议吗?

2 个答案:

答案 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等。在大多数现代模型中,名称空间和属性被视为单独的东西,因此计数属性将不包括名称空间声明。