读写XML数据

读写XML数据

在Java语言崛起的同时,计算机软件开发也发生了重大变化,这就是可扩展标记语言(XML)的面世。XML是一种用于组织和存储数据以便程序读取的格式。通过XML,数据的读写完全可以独立于创建它的软件。

XML数据可以使用分析器(parser)来读取,分析器是一种能够识别XML格式并提取所需数据的程序。下面我们将使用XML对象模型(XML Object Model , XOM)来读写XML数据,XOM是一个Java类库,在Java程序中使用XOM可以方便地处理XML数据。

1、创建XML文件

XML数据无处不在,可存储在文件中,可通过Internet网络传输,可以存储在内存中。Java类库中有多个可读写XML的类,其中包括jva.util包中的Properties类。Properties对象可存储为XML格式,当使用配置属性填充这种对象后,可以使用其storeToXML()方法将其保存到XML文件中,该方法接受两个参数:

>一个FileOutputStream对象:通过它将数据存储到文件中;

>一条注释:如果数据不需要注释,可以为空字符串。

下面是一个简单的应用程序,它将配置属性存储为XML格式:

public classJavaApplication1
{
    public JavaApplication1() {
        Properties properties = newProperties();
       properties.setProperty("username", "小武灵灵");
       properties.setProperty("userage", "22");
       properties.setProperty("userqq", "413672141");
        try {
            File file = new File("D:\\桌面\\桌面\\安卓开发工具\\学习笔记\\prop.xml");
            FileOutputStream fileOutputStream =new FileOutputStream(file);
            Date now = new Date();
            properties.store(fileOutputStream,"创建时间:" + now);
           
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
    }
   
    public static void main(String[] args)
    {
        JavaApplication1 application1 = newJavaApplication1();
        System.out.println("完毕");
    }
}

如果这些属性被存储为其他格式(如properties.store()方法),结果是这样的:

#\u521B\u5EFA\u65F6\u95F4:FriMar 22 20:27:47 CST 2013

#Fri Mar 22 20:27:47 CST2013

userqq=413672141

userage=22

username=\u5C0F\u6B66\u7075\u7075

这说明第一个放进去的property会在最下面,而且usernam跟我们输入的”小武灵灵”差别很大,这是编码引起的。而运行该程序时,他将创建如下所示的XML文件:

<?xml version="1.0"encoding="UTF-8" standalone="no"?>
<!DOCTYPE propertiesSYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Create timeFri Mar 22 20:33:57 CST 2013</comment>
<entrykey="userqq">413672141</entry>
<entrykey="username">小武灵灵</entry>
<entrykey="userage">22</entry>
</properties>

XML数据必须有一个根元素,它将所有数据括起,例如上面的<properties>。元素可以包含文本以及一个或多个子元素。XML元素还可以有一个或多个属性,它们是在元素的起始标记中以name=”value”的方式定义的。属性之间必须用空格分开,它们提供了与元素相关的补充信息。

虽然XML被称为一种类似于HTML的格式,但它本身并非一种语言。相反XML描述如何根据要使用计算机程序完成的任务创建数据格式。XML格式被称为方言(dialect)。

2、读取XML文件

下面说一个人,这个人是程序员兼图书作者ElliotteRusty Harold,这个人是Java语言和XML方面的专家,对现有的XML类库的工作原理非常失望,所以创建了自己的类库,用树表示XML数据,并将每个元素作为节点,从此便得到了广泛的使用。下载地址为http://www.cafeconleche.org/XOM/xom-1.2.9.jar安装步骤为:

>打开项目属性,在左侧栏选择库,右侧点击添加库;

>在弹出的对话框中点击创建,库名输入XOM,确定;

>右侧点击添加Jar/Folder,选择存放下载的XOM类库的jar文件(我这里是C:/Java/XOM),确定;

>选择XOM类库,点击添加,确定,OK了。

XOM包含可用于读写XML数据并将其存储到文件或其他目的地的类。类库中的核心类位于nu.xom包中,Builder类能够加载并分析使用任何方言的XML数据,只要它是良好的格式的,下面的代码创建一个Builder对象并使用它加载一个文件:

File file = newFile("D:\\桌面\\桌面\\安卓开发工具\\学习笔记\\prop.xml");

nu.xom.Builder builder = new Builder();

nu.xom.Document document = builder.build(file);

XOM也可以加载Web上的XML数据,只需将builder.build()的参数改为网络地址:

document =builder.build("http://blog.youkuaiyun.com/zhai56565");

当builder对象加载XML数据时,以Document对象的方式提供它,该对象存储了整个XML文档。要检索文档的根元素,可使用Document对象的getRootElement()方法:

Element root = document.getrootElement();

Element类表示单个元素,可使用Element类的多个方法来查看元素的内容:

>getFirstChildElement():提取与指定名称相同的第一个子元素;

>get(int):读取与指定索引匹配的元素;

>getChildeElements():提取所有的子元素;

>getValue():读取元素的文本;

>getAttribute():检索元素及其值。

下面的语句检索comment元素及其值:

Element element = document.FirstChildElement(“time”);

String time = element.getValue();

在多个元素的名称相同时,这种方法将不管用。对于这样的元素,可检索所有的元素并使用for循环遍历他们:

nu.xom.Elements elements =document.getRootElement().getChildElements("entry");

for (int i = 0; i < elements.size();i++) {

Element element = elements.get(i);

}

该程序没有使用属性,但是可使用方法getAttribute()来访问元素的属性,该方法将属性名作为参数:

Attribute key =element.getAttribute(“key”);

有了属性后,就可以使用其getValue()方法来获取其对应的值:

String keyValue =key.getValue();

下面是一个完整的例子:

public classJavaApplication1
{
    int[] highTemp = new int[6];
    int[] lowTemp = new int[6];
    String[] conditions = new String[6];
    public JavaApplication1() throwsParsingException, ValidityException, IOException {
        Builder builder = new Builder();
        Document document =builder.build("http://tinyurl.com/rd4r72");
        Element root =document.getRootElement();
        Element simple =root.getFirstChildElement("simpleforecast");
        Elements days = simple.getChildElements();
        for (int i = 0; i < days.size();i++) {
            Element day = days.get(i);
            Element high =day.getFirstChildElement("high");
            Element highF =high.getFirstChildElement("fahrenheit");
           
            Element low =day.getFirstChildElement("low");
            Element lowF =low.getFirstChildElement("fahrenheit");
           
            Element icon =day.getFirstChildElement("icon");
           
            lowTemp[i] = -1;
            highTemp[i] = -1;
            try {
                lowTemp[i] =Integer.parseInt(lowF.getValue());
                highTemp[i] =Integer.parseInt(highF.getValue());
            } catch (Exception e) {
            }
            conditions[i] = icon.getValue();
        }
    }
 
    public void display()
    {
        for (int i = 0; i <conditions.length; i++) {
           System.out.println("Period" + i);
           System.out.println("\tConditions:" + conditions[i]);
           System.out.println("\tHigh:" + highTemp[i]);
           System.out.println("\tLow:" + lowTemp[i]);
        }
    }
   
    public static void main(String[] args)
    {
        try {
            JavaApplication1 application1 = newJavaApplication1();
            application1.display();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
       
        System.out.println("完毕");
    }
}

3、读取RSS聚合内容(Syndication Feeds)

有数百种XML方言,以独立于平台和软件的方式表示数据。其中最流行的一种是RSS,它是一种用于共享新闻摘要和连接的格式,这些信息摘要和连接来自在线新闻网站、博客和其他信息源。

RSS使得能够以XML格式提供Web内容,非常适合以通过网络能够访问的文件方式提供。RSS阅读器又称为新闻聚合器,已被数以百万计的信息搜集者用于跟踪最喜欢的网站。还有搜集和共享RSS内容的Web应用程序。

String rssUrl = “http://feeds.drudge.com/retort”;

Builder builder = newBuilder();

Document doc =builder.build(rssUrl);

下面是读取一个RSS文件并显示最新的15个条目:

public classJavaApplication1
{
    String[] title = new String[15];
    String[] link = new String[15];
    int count = 0;
   
    public JavaApplication1(String rssUrl) {
        try {
            Builder builder = new Builder();
            Document document =builder.build(rssUrl);
            Element root =document.getRootElement();
            Element channel =root.getFirstChildElement("channel");
            if (channel != null) {
                Elements items =channel.getChildElements("item");
                for (int i = 0; i <items.size(); i++) {
                    if (count > 15) break;
                    Element item = items.get(i);
                    Element titleElement =item.getFirstChildElement("title");
                    Element linkElement =item.getFirstChildElement("link");
                    title[i] =titleElement.getValue();
                    link[i] =linkElement.getValue();
                    count++;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    void ListItems()
    {
        for (int i = 0; i < 15; i++) {
            if (title[i] != null) {
               System.out.println("\n" + title[i]);
                System.out.println(link[i]);
                i++;
            }
        }
    }
   
    public static void main(String[] args)
    {
        JavaApplication1 application1 = newJavaApplication1("http://feeds.drudge.com/retort");
        application1.ListItems();
        System.out.println("完毕");
    }
}

<think>好的,我现在需要帮助用户解决如何在Revit中通过API进行XML数据读写操作,并且提供示例代码。首先,我需要回忆一下Revit API的基本结构和相关类库。Revit API主要使用C#,所以示例代码应该用C#编写。 用户提到XML读写,可能需要用到System.Xml命名空间下的类,比如XmlDocument、XmlReader、XmlWriter等。同时,Revit的API中是否有与XML相关的特定方法或类呢?比如,处理配置数据或者外部数据存储。可能还需要考虑事务处理,因为Revit中的修改需要在事务中完成。 接下来,我需要考虑如何将XML数据与Revit元素关联。例如,用户可能希望将XML中的数据存储到某个元素的参数中,或者从参数中读取数据写入XML。这时候可能需要用到Element的Parameters属性,或者ExternalDefinition创建共享参数。 然后,我需要确保代码示例的正确性。例如,读取XML文件时,可能需要指定路径,处理异常情况,如文件不存在。写入XML时,需要创建节点、属性等。同时,在Revit中操作需要确保在正确的上下文中,比如使用IExternalCommand接口。 还要注意引用的问题。用户提供的引用中,引用[3]提到用SnoopDB查看Revit加载的类和对象,这可能与调试或查看内部状态有关,但当前问题更关注XML读写,所以可能不直接相关。不过引用[1]和引用[2]中的问题涉及配置文件和数据处理,可能间接相关,比如调整解析器设置或数据加载方式,但用户的问题更具体于Revit API和XML操作。 可能的步骤: 1. 创建一个新的外部命令(IExternalCommand)来实现功能。 2. 在命令中读取XML文件,解析数据。 3. 将数据写入Revit元素或参数。 4. 或者从元素中读取数据并写入XML文件。 需要注意事务管理,Revit要求修改文档必须放在事务中。同时,处理XML时可能需要异常处理,比如文件访问权限、格式错误等。 示例代码结构可能包括: - 使用XmlDocument加载和解析XML。 - 使用FilteredElementCollector获取特定元素。 - 使用Transaction来提交修改。 此外,用户可能需要了解如何将XML数据映射到Revit元素属性,例如将XML中的参数值写入墙或梁的实例参数中。如果参数不存在,可能需要创建共享参数。 最后,生成相关问题,比如如何优化读写性能,如何处理复杂数据结构,或者如何与外部系统集成。</think>### Revit API 读写 XML 数据教程 #### 1. 基本思路 Revit API 通过 C# 提供 XML 数据操作支持,需结合 `System.Xml` 命名空间实现。核心步骤如下: 1. **创建外部命令**:通过 `IExternalCommand` 接口实现功能入口。 2. **事务管理**:所有修改模型的操作需包含在事务中。 3. **XML 读写**:使用 `XmlDocument` 或 `XmlReader/XmlWriter` 处理数据。 4. **数据映射**:将 XML 数据与 Revit 元素参数关联(如共享参数或实例参数)[^3]。 --- #### 2. 示例代码:将 XML 数据写入 Revit 元素参数 ```csharp using System.Xml; using Autodesk.Revit.DB; using Autodesk.Revit.UI; public class WriteXmlToRevit : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Document doc = commandData.Application.ActiveUIDocument.Document; // 读取 XML 文件 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("C:\\data\\parameters.xml"); // 替换为实际路径 // 获取 XML 中的参数值 XmlNode node = xmlDoc.SelectSingleNode("/Parameters/Width"); double width = Convert.ToDouble(node.InnerText); // 获取目标元素(示例:第一个墙) FilteredElementCollector collector = new FilteredElementCollector(doc); Wall wall = collector.OfClass(typeof(Wall)).FirstElement() as Wall; using (Transaction trans = new Transaction(doc, "Write XML Data")) { trans.Start(); // 修改元素的实例参数 Parameter param = wall.get_Parameter(BuiltInParameter.WALL_USER_WIDTH_PARAM); if (param != null && !param.IsReadOnly) { param.Set(width); } trans.Commit(); } return Result.Succeeded; } } ``` --- #### 3. 示例代码:从 Revit 元素读取数据XML ```csharp using System.Xml; using Autodesk.Revit.DB; using Autodesk.Revit.UI; public class ReadRevitToXml : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Document doc = commandData.Application.ActiveUIDocument.Document; // 创建 XML 文档 XmlDocument xmlDoc = new XmlDocument(); XmlElement root = xmlDoc.CreateElement("Parameters"); xmlDoc.AppendChild(root); // 获取元素数据(示例:第一个梁) FilteredElementCollector collector = new FilteredElementCollector(doc); FamilyInstance beam = collector.OfCategory(BuiltInCategory.OST_StructuralFraming).FirstElement() as FamilyInstance; // 提取参数值 double length = beam.get_Parameter(BuiltInParameter.INSTANCE_LENGTH_PARAM).AsDouble(); // 写入 XML XmlElement elemLength = xmlDoc.CreateElement("Length"); elemLength.InnerText = length.ToString(); root.AppendChild(elemLength); // 保存文件 xmlDoc.Save("C:\\data\\output.xml"); // 替换为实际路径 return Result.Succeeded; } } ``` --- #### 4. 关键注意事项 - **事务范围**:所有修改操作必须包裹在 `Transaction` 中,否则会抛出异常。 - **参数类型**:需确认目标参数是否可写(通过 `Parameter.IsReadOnly` 检查)。 - **单位转换**:Revit 内部使用英尺为单位,需根据需求转换单位[^3]。 - **错误处理**:添加 `try-catch` 块处理文件访问或数据解析异常。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值