操作XML元素属性的顺序

16 浏览
0 Comments

操作XML元素属性的顺序

我已经阅读了很多帖子,人们在其中询问如何强制指定XML元素的属性顺序,而一般的回答是它不合法/不需要/不允许/不相关/其他。如果你的观点是我不应该关心属性顺序,请不要回复。

我有一个真正需要解决的问题。一个大型公司的产品在其最新版本中将以下两个元素视为不同的:



特别是,如果“allowmultiple”属性在“questiontype”之后,它将作为问题类型的修饰符。如果在之前,它将被忽略-这是不应该的。

因此,他们短期内不太可能修复他们的产品。

我正在使用以下代码操作此XML内容:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
doc = dbf.newDocumentBuilder().parse(new InputSource(path));

内部实现将对DOM节点映射中的属性进行排序。当它被写回文件时,它按照它们现在的排序顺序写入属性。我有很多代码在使用XPath操作Document对象。

当我完成操作Document后,我目前使用以下代码将其写回:

Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(new DOMSource(lc.getDocument()), new StreamResult(new File(paths[1])));

我需要能够确保allowmultiple属性在questiontype之后写入。

我尝试理解是否可以影响用于写入DOM树的序列化方式,或者是否可以简单地替换一个不会将属性初始解析为排序映射的实现。我猜两者都可以解决问题,但我尚未找到如何实现这一点的方法。

我查看了LSSerializer,但我不确定如何拦截特定的元素。我是否需要扩展FileOutputStream并寻找某些内容?

我阅读过SAX可能不会进行初始排序,但我需要能够轻松地插入解析器,而不需要太多新代码,而且对整个XML领域的了解不太深。

有人能提供一种解决方法吗?

0
0 Comments

XML元素属性的顺序问题及解决方法

在处理XML文件时,有时会遇到需要控制XML元素属性的顺序的情况。这可以通过使用JAXB(Java Architecture for XML Binding)方法来实现。下面我们将讨论出现该问题的原因以及解决方法。

在处理XML文件时,元素属性的顺序是由XML编写器自动确定的,通常与元素属性在代码中的顺序无关。然而,有时候我们可能需要在生成的XML文件中手动控制元素属性的顺序,以满足特定的需求。

为了解决这个问题,我们可以使用JAXB库来操作XML文件。JAXB是Java平台的一种技术,它提供了一种简单的方法来将Java对象与XML文件相互转换。在JAXB中,我们可以使用@XmlType和@XmlAccessor注解来控制生成的XML元素属性的顺序。

下面是一个使用JAXB方法来操作XML元素属性顺序的示例:

@XmlType(propOrder = {"name", "age", "gender"})
public class Person {
    private String name;
    private int age;
    private String gender;
    // 省略构造函数和getter/setter方法
    // 使用@XmlAccessor注解控制属性的顺序
    @XmlElement(name = "name")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlSchemaType(name = "token")
    public String getName() {
        return name;
    }
    @XmlElement(name = "age")
    public int getAge() {
        return age;
    }
    @XmlElement(name = "gender")
    public String getGender() {
        return gender;
    }
}

在上面的示例中,我们使用@XmlType注解的propOrder属性来指定生成XML元素属性的顺序。在Person类中,我们通过在getter方法上使用@XmlElement注解来指定属性的顺序。

使用JAXB操作XML元素属性的顺序时,我们需要注意以下几点:

1. 需要引入JAXB库的依赖。

2. 使用@XmlType注解的propOrder属性来指定属性的顺序。

3. 在getter方法上使用@XmlElement注解来指定属性的顺序。

通过使用JAXB库的方法,我们可以轻松地控制XML元素属性的顺序,以满足特定的需求。这使得我们能够更加灵活地操作XML文件,并确保生成的XML文件符合预期的格式。

总结起来,通过使用JAXB库的方法,我们可以解决XML元素属性顺序问题。通过使用@XmlType和@XmlAccessor注解,我们可以控制生成的XML元素属性的顺序,以满足特定需求。这为我们操作XML文件提供了更大的灵活性和便利性。

0
0 Comments

XML元素属性的顺序在某些情况下是很重要的,但XML本身并没有规定属性的顺序。然而,有时候我们希望能够控制属性的顺序,以提高XML文档的可读性。

Saxon是一个流行的Java XSLT和XQuery处理器,它提供了一种方法来控制XML元素属性的顺序。即将发布的Saxon 9.5版本中,添加了一个序列化属性,允许用户控制属性的顺序。这个功能最初是为了合理的用例而添加的(例如,将id属性始终放在最前面可以提高人类的可读性),但不幸的是,它最终也被用于解决那些由大型公司雇佣的程序员的无能和不负责任所导致的问题。但无论如何,只要能解决问题,我就不会抱怨。

对于如何使用Saxon来序列化org.w3c.dom.Document,最简单的方法是使用new net.sf.saxon.TransformerFactoryImpl(). newTransformer()来获取一个身份转换器(identity transformer),设置所需的序列化参数,然后调用transform()方法,提供一个DOMSource和一个StreamResult。

关于如何设置序列化参数,您可以参考Transformer的OutputProperties。至于如何控制属性的顺序,Saxon 9.5版本已经发布,相关功能的文档可以在saxonica.com/documentation/index.html#!extensions/output-extras/…找到。这是一个序列化功能,因为它控制了将结果树转换回词法XML的方式。

通过使用Saxon的序列化功能,您可以轻松地控制XML元素属性的顺序,以满足您的需求。这对于处理特定的XML文档结构或满足特定的业务需求非常有用。

0
0 Comments

在XML元素属性的顺序中进行排序可能是由于要满足特定的需求或规范而引起的。解决这个问题的方法是通过重命名属性来改变它们的顺序。

一种解决方法是通过将属性重命名为x1allowmultiple,这样它将成为最后一个属性。具体步骤如下:

1. 搜索并替换所有出现的allowmultiple为x1allowmultiple。

2. 进行处理并创建带有x1allowmultiple的输出文件。

3. 搜索并替换所有出现的x1allowmultiple为allowmultiple。

感谢这个想法。这是我最后的解决问题的方法,即通过使用sed来调整最终XML中的属性顺序。

以上就是解决"Manipulate order of XML element attributes"这个问题的原因和解决方法。

0