首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从文本模板中解析/提取信息

从文本模板中解析/提取信息
EN

Stack Overflow用户
提问于 2011-11-30 20:35:19
回答 4查看 1.3K关注 0票数 0

我需要根据给定的模板从传入的(例如xml)数据中提取信息。模板可以是XML或纯文本(逗号分隔)。对于每种类型的消息,存在一个模板,例如

代码语言:javascript
运行
复制
<SomeMessage>
    <Id>$id</Id>
    <Position>
        <X>$posX</X>
        <Y>$posY</Y>
        <Z>$posZ</Z>
    </Position>
</SomeMessage>

例如,传入的数据为:

代码语言:javascript
运行
复制
<SomeMessage>
    <Id>1</Id>
    <Position>
        <X>0.5f</X>
        <Y>1.0f</Y>
        <Z>0.0f</Z>
    </Position>
</SomeMessage>

现在我需要提取有关$id、$posX等的信息。

代码语言:javascript
运行
复制
Parser p = new Parser(templateString);
int id = p.Extract("id", incomingString);
float posx = p.Extract("posX", incomingString);

我需要一些东西,比如incomingData和模板的区别,然后在适当的位置提取信息。因为存在几个包含不同信息的模板,并且将来可能会扩展,所以我正在寻找一种通用的方法。

在这种情况下,模板也可以是

代码语言:javascript
运行
复制
$id,$posX,$posY,$posZ

然后传入的数据将会是

代码语言:javascript
运行
复制
1,0.5f,1.0f,0.0f

后一种情况可能更容易解析,但我需要一个能够同时处理(xml模板和非xml)的解决方案。

EN

回答 4

Stack Overflow用户

发布于 2011-11-30 20:48:44

您可以为每个字段创建一个具有属性的解析类:

代码语言:javascript
运行
复制
class Parser
{
    public string PositionX { get; set; }
    public string PositionY { get; set; }
    public string PositionZ { get; set; }

    public Parser(XmlNode item)
    {
        this.PositionX = GetNodeValue(item, "Position/X");
        this.PositionY = GetNodeValue(item, "Position/X/Y");
        this.PositionZ = GetNodeValue(item, "Position/X/Y/Z");
    }
}

如果您感兴趣,当数组不关心时,我可以提供一个例程,它可以从示例xml生成这样的解析类。GetNodeValue是一种使用xpath查询并返回xpath的值(基本是XmlNode.SelectSingleNode,添加了一些解析)的方法。

票数 1
EN

Stack Overflow用户

发布于 2011-11-30 21:01:46

这可能是一个好主意,每次使用一个接口和2个不同的模板。请注意,返回的消息并未完成,但它给了您一个概念。使用静态XElement.Parse,您可以解析格式良好的XML字符串,以便更方便地使用。

代码语言:javascript
运行
复制
public interface IParser
{
    Message Parse(String Payload);
}
 // Position Class
 public class Position
 {
 public int X { get; private set; }
 public int Y { get; private set; }
 public int Z { get; private set; }
 public Position(int X, int Y, int Z)
 {
  this.X = X;
  this.Y = Y;
  this.Z = Z;
 }
}
// Message Class 
public class Message
{
 public String ID { get; private set; }
 public Position Position { get; private set; }
 public Message(String ID, Position Position)
 {
   this.ID = ID;
   this.Position = Position;
 }
}
 // Parser Class
 public class XMLParser : IParser
{
 public Message Parse(string Payload)
 {
  var result = XElement.Parse(Payload);
  return new Message(result.Elements().ElementAt(0).Value, new Position(X,Y,Z);
 }
}
票数 0
EN

Stack Overflow用户

发布于 2011-11-30 21:02:53

对于每个模板,创建以下格式的解析器定义文件:

解析器类型(XML或CSV)

Variable1,路径

variable2,路径

for xml路径可以是someMessage、Position、x。

对于csv,您可能会忘记路径,只按顺序列出变量。

然后,当你读入你的模板文件时,你可以选择解析器类型和每个变量的路径。如果你有很多层次化的信息,那么你必须对此应用一点想象力,但对于你所给出的简单案例来说,这应该没问题。

对于CSV上的任何东西,您可能必须使用解析器,但是XML/XPATH非常容易找到基础知识。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8326050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档