将 Mac XML PList 解析为可读的内容
我正在尝试从 XML PList (Apple 系统Profiler)文件,并将其读入内存数据库,最后我想将其变成人类可读的东西。
问题在于该格式似乎很难以一致的方式阅读。我已经研究了一些解决方案,但还没有找到令我满意的解决方案。我总是不得不对很多值进行硬编码,并且最终不得不使用许多 if-else/switch 语句
。
格式如下所示。
<plist>
<key>_system</key>
<array>
<dict>
<key>_cpu_type</key>
<string>Intel Core Duo</string>
</dict>
</array>
</plist>
示例文件此处。
阅读完后(或阅读过程中),我会使用内部词典来确定信息的类型。例如,如果键是 cpu_type ,我会相应地保存信息。
我尝试(简化
)提取信息的几个示例。
XmlTextReader reader = new
XmlTextReader("C:\\test.spx");
reader.XmlResolver = null;
reader.ReadStartElement("plist");
String key = String.Empty; String str
= String.Empty;
Int32 Index = 0;
while (reader.Read()) {
if (reader.LocalName == "key")
{
Index++;
key = reader.ReadString();
}
else if (reader.LocalName == "string")
{
str = reader.ReadString();
if (key != String.Empty)
{
dct.Add(Index, new KeyPair(key, str));
key = String.Empty;
}
}
}
或者类似的东西。
foreach (var d in xdoc.Root.Elements("plist"))
dict.Add(d.Element("key").Value,> d.Element("string").Value);
我找到了一个框架,我可以在此处进行修改。
一些更有用的信息
Mac OS X 有关系统分析器的信息此处。
用于解析 XML 文件的 Apple 脚本此处。
对此的任何建议或见解将不胜感激。
I am trying to pull data from XML PList (Apple System Profiler) files, and read it into a memory database, and finally I want to turn it into something human-readable.
The problem is that the format seems to be very difficult to read in a consistent manner. I have gone over a few solutions already, but I haven't found a solution yet that I found satisfying. I always end up having to hard code a lot of values, and end up having to many if-else/switch statements
.
The format looks like this.
<plist>
<key>_system</key>
<array>
<dict>
<key>_cpu_type</key>
<string>Intel Core Duo</string>
</dict>
</array>
</plist>
Example file here.
After I have read (or during reading), I make use of an internal dictionary that I use to determine what type of information it is. For example, if the key is cpu_type
I save the information accordingly.
A few examples that I have tried (simplified
) to pull the information.
XmlTextReader reader = new
XmlTextReader("C:\\test.spx");
reader.XmlResolver = null;
reader.ReadStartElement("plist");
String key = String.Empty; String str
= String.Empty;
Int32 Index = 0;
while (reader.Read()) {
if (reader.LocalName == "key")
{
Index++;
key = reader.ReadString();
}
else if (reader.LocalName == "string")
{
str = reader.ReadString();
if (key != String.Empty)
{
dct.Add(Index, new KeyPair(key, str));
key = String.Empty;
}
}
}
Or something like this.
foreach (var d in xdoc.Root.Elements("plist"))
dict.Add(d.Element("key").Value,> d.Element("string").Value);
I found a framework, that I may be able to modify here.
Some more useful information
Mac OS X Information on the system profiler here.
Apple script used to parse the XML-files here.
Any advise or insight into this would be deeply appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我对此的第一个想法是使用 XSLT(XSL 转换)。根据您在上述评论中的回答,我不知道您到底在寻找什么格式,但我认为我至少明白了要点。除非有一些我没有想到的特殊需要,否则我相信 XSLT 足够强大,可以完成您需要的一切,并且不需要一堆复杂的循环构造。
如果您不熟悉,w3schools 上有很多关于 XSLT 的好信息(可能从简介开始:http://www.w3schools.com/xsl/xsl_intro.asp),维基百科也有一篇不错的文章(http://en.wikipedia.org/wiki/XSLT)。
我总是需要一段时间才能让规则按照我想要的方式运作;这是一种不同的思考这种转变的方式,我花了一些时间来适应。对 XPATH 有充分的了解也是必要的。我经常需要参考 XSLT 规范 (http://www.w3.org/TR/xslt )和 XPATH 规范(http://www.w3.org/TR/xpath/ )因为我只有一个少量的使用经验,可能一旦你使用了一段时间,它就会变得更加顺利。
不管怎样,我有一个我之前写的应用程序来处理这些翻译。它是一个 C# 应用程序,具有三个文本框:一个用于 XSLT,一个用于源,一个用于输出。我花了几个(好吧,很多)个小时尝试获得一个可以处理示例数据的 XSLT 的第一部分,以了解它的难度以及转换的结构。我想我终于弄清楚了需要什么,但由于我不知道你到底需要什么格式,所以我停在那里。
以下是示例转换输出的链接:http://pastebin.com/SMFxUdDK。
以下是实际执行转换的所有代码,包含在您可以用来进行开发的表单中。它并不花哨,但对我来说效果很好。 “繁重的工作”都是在“btnTransform_Click()”处理程序中完成的,另外我还实现了一个 XmlStringWriter,以便可以轻松地按照我想要的方式输出内容。这里的主要工作只是提出 XSLT 指令,实际的转换在 .NET XslCompiledTransform 类中已经为您很好地处理了。然而,我认为当我编写它时,我已经花了足够的时间来弄清楚它的所有小细节,值得给出一个工作示例......
请注意,我在这里动态更改了命名空间的几次出现,还向 XSLT 添加了一些简单的注释,因此如果有问题请告诉我,我会更正它们。
所以,没有进一步的告别:;)
XSLT 文件:
我制作的一个小帮助器类(
XmlStringWriter.cs
):Windows 窗体设计器类(
frmXSLTTest.Designer.cs
)表单类 (
frmXSLTTest.cs
):my first thought for this is just to use XSLT (XSL transformations). i don't know exactly what format you are looking for based on your answer in the above comments, but i think i got the gist at least. unless there's something special you need that i didn't think of, i believe XSLT is powerful enough to do everything you need, and no need for a bunch of complicated looping constructs.
if you're not familiar, there's a lot of good information on XSLT on w3schools (probably start at the intro: http://www.w3schools.com/xsl/xsl_intro.asp) and also wikipedia has a decent writeup on it (http://en.wikipedia.org/wiki/XSLT).
it always takes me a while to get the rules working the way i want; it's a different way of thinking about this kind of transform and took me some getting used to. it's necessary to have a decent understanding of XPATH as well. i am constantly having to refer to both the XSLT spec (http://www.w3.org/TR/xslt) and the XPATH spec (http://www.w3.org/TR/xpath/) since i've only had a small amount of experience with it, probably once you have worked with it a while it goes more smoothly.
anyway, i have an app i wrote previously for playing around with these translations. it's a C# application with three textboxes: one for the XSLT, one for the source, and one for the output. i spent a few (okay, many) hours trying to get a first cut of an XSLT that would process your sample data, to get an idea of how hard it would be and what the structure of the transform would be. i think i finally figured out pretty much what was needed, but since i don't know exactly what format you need, i stopped there.
here's a link to the sample transformed output: http://pastebin.com/SMFxUdDK.
following is all the code to actually do the transform, included in a form that you can use to develop as you go. it's not fancy but it has worked well for me. the "heavy lifting" is all done in the "btnTransform_Click()" handler, plus i have implemented an XmlStringWriter to make it easy to output things the way i want. the main bit of the work here is just in coming up with the XSLT directives, the actual transform is fairly well handled for you in the .NET XslCompiledTransform class. however, i figured i had spent enough time figuring out all the little details on it when i wrote it that it was worth giving a working example...
be aware i changed a couple of occurrences of a namespace here on-the-fly, and also added some light comments to the XSLT, so if there are issues let me know and i will correct them.
so, with no further adieu: ;)
the XSLT file:
a little helper class i made (
XmlStringWriter.cs
) :the windows forms designer class (
frmXSLTTest.Designer.cs
)the form class (
frmXSLTTest.cs
):